1. 程式人生 > >C# 用匿名委託的方式簡化Thread 和 Controle.Invoke的寫法

C# 用匿名委託的方式簡化Thread 和 Controle.Invoke的寫法

 1. Thread
C# 程式中,如果要新建一個 Thread 的話,一般需要另建一個 方法,如果要傳引數的話,需要的步驟比較麻煩,
參考一
Thread oThread = new Thread(new ThreadStart(threadMethod)); 
private void threadMethod(){
..
};

如果要向執行緒傳遞引數

public static void myStaticParamThreadMethod(Object obj)  {  
   Console.WriteLine(obj);
    }  

Thread thread = new Thread(myStaticParamThreadMethod); 
thread.start(obj);

當然還有其他的一些寫法,可以參見參考1檢視更詳細的資訊

但如果使用匿名類的話,則會簡單些

Thread oThread = new Thread(delegate()
            {
            ....
            });           
            oThread.Start();
           
2.Control.Invoke

C#中, 呼叫如果多執行緒更新 UI的屬性時,會報異常:Cross-thread operation not valid

一般的解決方法是宣告一個委託,然後通過委託也呼叫,具體見參考2

private delegate void FlushClient();//代理

 private void ThreadFunction()
        {
            if (textBox1.InvokeRequired)//等待非同步
            {
                FlushClient fc = new FlushClient(ThreadFunction);
                this.Invoke(fc);//通過代理呼叫重新整理方法
                return;
            }
                textBox1.Text = DateTime.Now.ToString();
        }

   這裡要先宣告一個委託,感覺比較麻煩,因為總要多寫一些委託,而這些委託卻是臨時一個過渡,改成匿名委託後就不需要再去宣告那些委託了
  
    private void ThreadFunction()
        {
            if (textBox1.InvokeRequired)//等待非同步
            {
                this.Invoke(new MethodInvoker(delegate()
                {
                    ThreadFunction();
                }));
                return;
            }
                textBox1.Text = DateTime.Now.ToString();
        }
  
   程式碼量沒有減少,但是卻不必要去宣告那個臨時用的委託了
  
參考1: http://developer.51cto.com/art/200908/141590.htm
參考2: http://www.cnblogs.com/zhaotiantang/archive/2009/03/17/1414135.html