2009-08-30 197 views
5

在閱讀MSDN文檔和代碼示例時,我對某些術語感到困惑。同步和異步回調

什麼是C#中的回調?特別是,什麼是同步和異步回調?

請從外行人的角度解釋這些。

另外,請解釋 IAsyncCallbackIAsyncResult接口。 我們如何實現它? (非常簡單的例子)

在此先感謝。

回答

13

IAsyncCallback接口不存在,所以你不能實現它。

我懷疑你真的想知道IAsyncResult interface

我建議您在MSDN上閱讀this page


IAsyncResult interface表示的操作(例如,web請求或數據庫呼叫),其在後臺運行,同時您的代碼繼續執行。它可以告訴你操作是否完成(IsCompleted屬性)。它還爲您提供了一個WaitHandle objectAsyncWaitHandle屬性),可用於等待操作完成。 (通過調用result.AsyncWaitHandle.WaitOne()

您可以通過調用一個BeginWhatever方法得到IAsyncResult。 (BeginExecuteReader,BeginGetResponse,和許多其他)。 BeginWhatever方法將採取該操作所需的任何參數(例如,BeginExecuteReader可以採用CommandBehavior參數),並且可以採用AsyncCallback委託(而非接口)和狀態參數。在返回一個IAsyncResult對象。

AsyncCallback委託是您提供的方法,將在操作完成時調用。它通常會在不同的線程中調用,所以要小心。您的AsyncCallback方法將獲得與之前提供的方法相同的IAsyncResult。狀態參數放入IAsyncResult中並被系統忽略;您可以在AsyncCallback方法中使用它來跟蹤操作的用途。(該狀態可以是你希望它是什麼,包括null

裏面你的AsyncCallback(或其他地方),你可以調用對應於您在叫BeginWhatever方法EndWhatever方法第一名。您必須從BeginWhatever或從AsyncCallback中爲其提供IAsyncResult。當你調用它時,它會等待操作完成(如果尚未完成),然後將操作結果返回給您。 (假設操作返回某些內容;例如,WebRequest.EndGetResponse將返回WebResponse)。如果在操作過程中發生任何錯誤,EndWhatever將引發異常。


如果您想創建可以在後臺運行的自己的操作,那麼您將實現IAsyncResult。您還將分別創建BeginWhateverEndWhatever方法返回並將其分別。有關實現IAsyncResult的更多信息,請參閱here

+0

抱歉錯別字error.As你說我需要澄清IAsyncResult.Thank很多你的解釋。 – user160677 2009-08-30 19:44:09

+2

非常好的解釋非常感謝 – user160677 2009-08-30 20:01:39

2

回調只不過是一個代表。使用術語回調函數是因爲您通常將它(委託)傳遞給方法(作爲參數),然後在該方法中調用以表示某種信號。

同步和異步回調是。同步,在調用方法的同一個線程上執行(啓動操作)。異步通常在另一個線程上執行(但不總是)

IAsyncCallback接口是一個用於啓動異步任務的模板。你傳入一個回調(委託),當工作完成時調用它。有一個屬性可以確定該方法是否同步執行。

+0

非常感謝你 – user160677 2009-08-30 20:14:35

4

對於同步回調,調用方法(或線程)必須等待被調用方法完成後才能進行處理 - 這很像「普通」方法調用。

使用異步回調,調用方法(或線程)可以繼續處理其他輸入或事件或任何其他內容,而無需等待被調用的方法完成。

對於應用程序用戶界面線程,如果您不希望它在應用程序執行一些冗長的過程時「凍結」,則需要使用異步回調。

+1

謝謝克里斯的解釋 – user160677 2009-08-30 19:49:45

+0

沒問題 - 還有很多比它,我會建議閱讀更多關於MSDN和在這裏搜索有關多線程的問題。 – ChrisF 2009-08-30 19:55:26

+0

當然,我會按照建議通過MSDN。感謝很多 – user160677 2009-08-30 20:05:11