.NET委託解析(異步委託)

上一篇我們瞭解到了,委託的基本感念,列舉了幾個委託的實例,並根據實例來反編譯源碼查看.NET 委託的內部實現,從淺入深的角度來詳細的去解析委託的實質,本文將系上篇繼續討論異步委託的實現以及異步委託的源碼解析。

首先本文只會從委託的層面的去編寫,不會涉及到深層次的異步.(後續的系列中將會對異步進行深入講解.敬請關注.).

委託的異步調用方式

上一篇中我們在實例中是直接通過委託對象的,例如:

private static void Main(string[] args)
 {
       Program.MyPersonDelegate personDelegate = new Program.MyPersonDelegate(Person.GetPersonName);
       personDelegate("Static");
 }
點擊personDelegate查看:
// FuncActionDemo.Program.MyPersonDelegatepublic virtual extern void Invoke(string name);
我們可以看到委託對象的默認調用方式是Invoke(同步調用).另外我們將它進行反編譯查看一下 : 

spacer.gif

我們可以看到委託對象有void Invoke , System.IAsyncResult BeginInvoke,void EndInvoke . 這三個構造函數,我們下面先解釋一下這三個構造:
Invoke : 委託回調函數時候的一種同步調用方式.
BeginInvoke : 委託回調函數時候的一種異步調用方式.和Invoke對立
EndInvoke : 異步調用,用於檢索調用結果.
在IT,特別是編程界,概念往往是不容易理解的,當然除非你是具備超強的功底.否則還是通過實例來驗證一下爲好:
public delegate void delegateTest(string str);static void Main(string[] args)
{
delegateTest test = new delegateTest(GetIntance);
IAsyncResult result = test.BeginInvoke("這是異步執行的", null, null);
test.EndInvoke(result);
Console.WriteLine("這是同步執行的");
Console.ReadLine();    //test.BeginInvoke("", new AsyncCallback((result) => Console.WriteLine("")), null);    //Console.WriteLine(@"異步執行的同時並沒有影響我的執行");    //Console.WriteLine(@"異步執行的同時並沒有影響我的執行2");    //Console.ReadLine();}private static void GetIntance(string str)
{
    Console.WriteLine(str);
}

在上述代碼中,我們聲明瞭一個委託delegateTest, 和一個靜態方法GetIntance並有一個string類型的形參, 然後在Main函數中,我們創建了一個委託實例,並回調了GetIntance,通過委託實例的BeginInvoke來異步執行GetIntance,通過BeginInvoke的第一個參數爲GetIntance的實參( 注意:BeginInvoke的參數,最後兩個分別爲 : CallBack,Object,然後首個參數更明確的說是BeginInvoke的參數根據委託類型的的參數而定. )之後我們在通過test.EndInvoke(result);來判斷異步是否執行完成,前面我們說過EndInvoke的作用就是用來判斷BeginInvoke是否執行完成,如果執行完成才繼續執行下一步如果沒有完成則等待.,通過如果我們將EndInvoke去掉,那麼最後調用的結果肯定爲 : "這是同步執行的" --> "這是異步執行的" . 那麼我們加上EndInvoke的話最後的輸出結果爲:"這是異步執行的" --> "這是同步執行的"; ( 如果大家有異步的概念,對於這個其實很好了解的,關於異步在接下來的系列中會着重編寫. ,首先異步和併發是密不可分的,其次在目前的研發中來講並行編程也是提高生產效率的一種可行性方式,最後微軟在C#5.0中對與併發/異步編程的方式進行了簡化,也可以理解爲語法糖更豐富了).


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