protected void s(){
        thread = new System.Threading.Thread(
                          new System.Threading.ThreadStart(download));
                thread.Start();
        }
        protected void download()
        {
           //进行多文件下载操作
            SFTP.download(drive);
        }
         private System.Threading.Timer timerlisten;
        protected void start()
        {
             s();  //这里我启用一个线程
              timerlisten = new System.Threading.Timer(new TimerCallback(displayProgess), this, 5000, 100);
              //我又启用一个timer的多线程,来监控单个文件下载的进度
         }        //我想知道怎么才能监控到下载进程的结束,我试过在里面加上
        thread.join();
        //但是线程就会阻塞在那了,timer都走不了,必须得等那个下载进程走完,这不是我想要的效果
        //我也试过用其他办法
         AutoResetEvent events = new AutoResetEvent(false);
            List<AutoResetEvent> Events = new List<AutoResetEvent>();
            Events.Add(events);
            WaitCallback wait = new WaitCallback(s);
            ThreadPool.QueueUserWorkItem(wait);
            if (WaitHandle.WaitAll(Events.ToArray()))
            {
                MessageBox.Show("2");
            }
          //还是不行,求解= =

解决方案 »

  1.   

    方法很多,可以线程结束时发消息给进程,或者线程中不是有waitone吗,或者用api的waitforsingleobject
      

  2.   

    就你的题目来看
    可以用Thread ::ThreadState 属性就你代码的注释来看
    你至少要知道正在下载的文件的大小,
    记录每次接收的大小
    可以根据时间自己评估速度,
    来计算下载进度的百分比。
      

  3.   

    线程结束前给主线程发一个消息
    dllimport下postmessage
      

  4.   

    AutoResetEvent events = new AutoResetEvent(false);进度线程中
    events.WaitOne();下载线程中
    SFTP.download(drive);
    evetns.Set();
    ps:如果SFTP.download(drive);另开线程,则另当别论。不是很理解你的疑问
      

  5.   

    AutoResetEvent events = new AutoResetEvent(false);
                
                WaitCallback wait = new WaitCallback(startagain);
                ThreadPool.QueueUserWorkItem(wait,events );
                thread = new System.Threading.Thread(
                          new System.Threading.ThreadStart(delegate
                {
                    while(true  ){
                        if (events.WaitOne(-1, true))
                        {
                            events.Set();
                            MessageBox.Show("2");
                            break;
                        }
                    }
                }));
                thread.Start();
    我也试过这样写,但是messagebox根本不鸟我回楼上,我下载的进程和监控的进程都是另外开的
      

  6.   

    主进程 开了 A,B两个线程,A来下载,B来监控
    我现在想让主进程知道A完了,好让A再执行,同时
    不影响B工作差不多,我现在就像知道这样的
      

  7.   

    ManualResetEvent manualEvent= new ManualResetEvent(fasle);
    form:
    //启动主线程
    //启动监控线程
    void button_click()
    {
       manualEvent.Set();
    }void MainWork()//主线程
    {
      while(true)
     {
         manualEvent.WaitOne();
         manualEvent.ReSet();
        //启动下载线程
     }
    }void DownLoad()//下载线程
    {
    //dosomething
    manualEvent.Set();
    }伪代码
      

  8.   

    谢谢ghost5216
    我混淆了概念哈,结贴