c#異步調用一個帶返回值的方法並獲取返回值

委託可以進行同步調用和異步調用。
委託的同步調用用Invoke方法實現。同步調用也可以叫阻塞調用,它將阻塞當前線程,然後執行調用,調用完畢後再繼續向下進行。同步調用會阻塞線程,如果是要調用一項繁重的工作(如大量IO操作),可能會讓程序停頓很長時間,造成糟糕的用戶體驗,這時候異步調用就很有必要了。
委託的異步調用通過BeginInvoke和EndInvoke來實現。異步調用不阻塞線程,而是把調用塞到線程池中,程序主線程或UI線程可以繼續執行。

首先,聲明委託並創建委託實例,委託要和方法有相同的參數和返回類型
public delegate int AsyncDelegate(int a);
private AsyncDelegate mydlgt = new AsyncDelegate(MyFunc);

瞭解一下BeginInvoke的原型
IAsyncResult AsyncDelegate.BeginInvoke(int a,AsyncCallback asyncCallback,object @object)
BeginInvoke方法觸發你的異步方法,它和你想要執行的異步方法有相同的參數。另外還有兩個可選參數,第一個是AsyncCallback委託是異步完成的回調方法。第二個是用戶自定義對象,該對象將傳遞到回調方法中。
//開啓異步執行方法MyFunc
IAsyncResult result = mydlgt.BeginInvoke(asyncCallback,null);

//異步調用的方法
private int MyFunc(int a)
{
}
AsyncCallback asyncCallback = new AsyncCallback(AsyncCallbackFunc);

//回調方法
public void AsyncCallbackFunc(IAsyncResult ar)
{
		int r = mydlgt.EndInvoke(ar);//在回調方法中結束異步,並獲取返回值
}

也可以在主線程中結束異步,當主線程運行到EndInvoke時,如果這時異步調用沒有結束(這種情況很可能出現),這時爲了等待調用結果,線程依舊會被阻塞。
mydlgt.EndInvoke(result);

因此,用回調函數,當調用結束時會自動調用回調函數,解決了爲等待調用結果,而讓線程依舊被阻塞的局面。

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