異步委託

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方法會阻塞當前的線程。

直到異步委託指向完成之後,才能繼續往下執行。








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章