1.先從一個小程序來了解異步委託。
<span style="font-size:18px;"> static void Main(string[] args)
{
//輸出主線程的Id
Console.WriteLine("Main:"+Thread.CurrentThread.ManagedThreadId);
Func<int, int, string> delFunc = (a, b) => {
//輸出當前線程的Id
Console.WriteLine("delegate:" + Thread.CurrentThread.ManagedThreadId);
return (a + b).ToString(); };
//使用異步委託
delFunc.BeginInvoke(3, 4, null, null);
Console.ReadKey();
}
</span>
當前輸出結果如下
<span style="font-size:18px;">delFunc.BeginInvoke(3, 4, null, null);</span>
將這段代碼改成
//同步委託
delFunc.Invoke(3,4);
結果大家可以試一下,線程Id肯定是相同的。
異步調用委託
內部原理就是:使用了一個線程池的線程去執行了委託指向的方法
當同步調用一個委託時, Invoke 方法直接對當前線程調用目標方法。 如果調用 BeginInvoke 方法,則公共語言運行時 (CLR) 會對請求進行排隊並立即返回到調用方。 會對來自線程池的線程異步調用目標方法。提交請求的原始線程自由地繼續與目標方法並行執行。如果在對 BeginInvoke 方法的調用中指定了回調方法,則當目標方法結束時將調用該回調方法。 在回調方法中, EndInvoke 方法獲取返回值和所有輸入/輸出參數或僅供輸出參數。 如果在調用 BeginInvoke 時未指定任何回調方法,則可以從調用 BeginInvoke 的線程中調用 EndInvoke。
這段摘自MSDN,大家可以作爲參考
EndInvoke方法會阻塞當前的線程。
直到異步委託指向完成之後,才能繼續往下執行。