複雜範例:非同步委派與執行緒池
public static void test4()
{
int a = 12;
int y = 32;
TheEvent ev2 = delegate(ref int x)
{
Console.WriteLine("output x + y : {0}", x + y);
Thread.Sleep(100);
};
// ev2(ref a); // 同步呼叫
IAsyncResult ar = ev2.BeginInvoke(ref a,
delegate(IAsyncResult ar2)
{
Console.Write("Operation finished: {0} on thread ID:{1}, is pool: {2}",
ar2.IsCompleted,
Thread.CurrentThread.GetHashCode(),
Thread.CurrentThread.IsThreadPoolThread);
},
null);
Console.WriteLine("do some other calculations while counter thread is working");
Console.Write("work status : {0} Main Thread ID:{1}, is pool: {2}",
ar.IsCompleted,
Thread.CurrentThread.GetHashCode(),
Thread.CurrentThread.IsThreadPoolThread);
Thread.Sleep(500);
ev2.EndInvoke(ref a, ar);
}
關鍵優勢
- 利用執行緒池排隊任務,適合 I/O 或計算密集型操作
- 匿名委派完整複製當前執行上下文的可用變數(閉包特性)
- 雖增加同步複雜度,但極大提升程式碼表達力