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