滥用线程你不担心吗?你应该使用 Timer。

解决方案 »

  1.   

    textBox1.BeginInvoke这句会将执行内容同步到GDI线程中去执行,所以主线程卡住
      

  2.   

    你绕来绕去,最后用TextBox1.BeginInvoke来调用,还是回到由UI线程来执行代码……要搞多线程,要先考虑下实际的运用目的。只是学习的话,记住用UI对象的invoke方法就是让ui线程来执行实际操作。
      

  3.   


    public class MyForm : System.Windows.Forms.Form {
                
        //UI 元素
        private Label lblStatus;
        
        private ProgressBar progressBar1;    //Delegate
        private delegate void MyProgressEventsHandler(
            object sender, MyProgressEvents e);    
         private void UpdateUI(object sender, MyProgressEvents e) {
            lblStatus.Text = e.Msg;
            myProgressControl.Value = e.PercentDone;
        }   //ShowProgress 现在可以记录为可从任何线程调用的公共方法。
        public void ShowProgress(string msg, int percentDone) 
       {
    if(InvokeRequired)
    {
       System.EventArgs e = new MyProgressEvents(msg, percentDone);
               object[] pList = { this, e };           BeginInvoke(new MyProgressEventsHandler(UpdateUI), pList);
    }
    else
            {
        UpdateUI(this, new MyProgressEvents(msg,
                PercentDone)); 
            }
           
        }     private void btnStart_Click(object sender, EventArgs e)
         {
          //启动线程
          Thread t = new Thread(new ParameterizedThreadStart(RunsOnWorkerThread));
          t.IsBackground = true;
          t.Start(input);
         }    //线程执行函数
        private void RunsOnWorkerThread() 
        {
            int i = 0;   
            while(...) //loop      
            {  
              DoSomethingSlow();
              ShowProgress("test",i);
              ++i;
            }
        }
       
    }这个例子没有用匿名函数和lambda表达式,好理解些
      

  4.   

    如果要修改,就是改动一行代码        private void Invoke_Click(object sender)
            {
                Thread.Sleep(16000);
                textBox1.BeginInvoke(new InvokeDelegate(InvokeMethod));
            }
            public void InvokeMethod()
            {
                textBox1.Text = "Executed the given delegate";
            }
    但是实际上滥用线程实在是没有必要。Timer是操作系统的中断控制的,是高效率的机制,触发事件之前只需要注册而不需要占用任何线程,不是你的线程可比的。
      

  5.   

    简单来说,Invoke中的代码,在UI线程执行,相当于单线程,这也是为什么UI更新操作要放在Invoke中同步才不会出错的根本原因。