举个例子:
 
界面上有一个 Panel,
 
用一个 System.Timers.Timer 相隔 2秒 开一个线程,线程处理的就是 New 一个ProgressBar() 添加到Panel里面。线程里要处理的代码如下:
     void ProcessWork()
        {            ProgressBar bar = new ProgressBar();
            panel1.Controls.Add(bar);
            bar.Dock = DockStyle.Top;
            bar.Maximum = 1000000;            for (int i = 1; i <= 1000000; i++)
            {
                bar.Value = i;
            }
        }
计时器不断相隔2秒开一个线程出来,但点样做到当前正在处理的线程没处理完成,其他线程在排队等待呢?而且不能让界面卡死...请高手们详细指教指教啊~~~~!!!!!

解决方案 »

  1.   

    System.Timer.Timer和System.Threading.Timer:   
    前者是通过调用Windows的WaitableTimer实现的,后者是.NET的简单的Thread.Sleep实现。两个实现都是用了.NET线程池(ThreadPool),所以Elapsed事件会在ThreadPool里选择一个线程执行。好处是如果前一次Elapsed没有完成,后一次的可以从ThreadPool里选一个新的线程开始执行
    多线程操作一个progreessbar
      

  2.   

    为何需要每2秒创建一个ProgressBar并添加到界面上呢,这应该比较费时间吧,或者说很容易出错的。你应该再给出点关键代码,看看你是怎么调用的。
      

  3.   


    其实这样做就是想为了模拟多线程操作主界面啊``但是要有顺序的操作,也就是当前线程没操作完成,其他线程需要等待,我试过用 Monitor.Wait(),但好像不行``而且会卡死界面``可能是我不会用望指点
            void Statr() 
               { 
                timer= new System.Timers.Timer(1000);
                timer.AutoReset = true;
                timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
                timer.Start();
              }       
            void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
            {
                    Thread thread = new Thread(ProcessWork);
                    thread.Start();
            }        void ControlAdd()
            {            ProgressBar bar = new ProgressBar();
                
                panel1.Controls.Add(bar);
                bar.Dock = DockStyle.Top;
                bar.Maximum = 1000000;            for (int i = 1; i <= 1000000; i++)
                {
                    bar.Value = i;
                }
            }
      

  4.   

    在winform中如果动态操作UI控件,需要使用委托.参考代码:delegate void DelegateBar(int i);DelegateBar delegateBar = new DelegateBar(this.ControlMethod);//ControlMethod 为事件代码,即对progressbar的操作然后在 ProcessWork 方法中加上
    for(int i = 1; i <= 100000;i++)
       bar.Invoke(this.delegateBar , new object[] { i});