使用 IAsyncResult 設計模式的異步操作實作為名為 BeginOperationName 和 EndOperationName 的兩個方法,分別開始和結束異步操作 OperationName。 例如,類別 FileStream 會提供 BeginRead 和 EndRead 方法,以異步方式從檔案讀取位元組。 這些方法會實作 方法的 Read 異步版本。
備註
從 .NET Framework 4 開始,工作平行連結庫會提供異步和平行程序設計的新模型。 如需詳細資訊,請參閱 工作平行連結庫 (TPL) 和 工作型異步模式 (TAP) 。
在呼叫 BeginOperationName 之後,應用程式可以在呼叫線程上繼續執行指令,同時異步操作會在不同的線程上進行。 對於每個呼叫 BeginOperationName,應用程式也應該呼叫 EndOperationName 以取得作業的結果。
開始非同步作業
方法 BeginOperationName 會開始異步作 OperationName ,並傳回實作 IAsyncResult 介面的物件。
IAsyncResult 對象會儲存異步作的相關信息。 下表顯示異步操作的相關信息。
| 會員 | 說明 |
|---|---|
| AsyncState | 選擇性的特定應用程式物件,包含有關異步操作的相關資訊。 |
| AsyncWaitHandle | WaitHandle,可用來封鎖應用程式執行,直到異步作完成為止。 |
| CompletedSynchronously | 這是一個值,指示是否在用來呼叫 BeginOperationName 的線程上完成異步作業,而不是在另一個 ThreadPool 線程上完成。 |
| IsCompleted | 指出異步操作是否已完成的值。 |
BeginOperationName 方法會接收在同步版本方法簽章中宣告,並透過傳值或傳址方式傳遞的任何參數。 任何 out 參數都不是方法簽章的 BeginOperationName 一部分。 方法 BeginOperationName 簽章也包含兩個額外的參數。 第一個 AsyncCallback 定義了一個委派,該委派會在異步操作完成時呼叫所參考的方法。 如果呼叫端不想在作業完成時叫用方法,則呼叫端可以指定 null (Nothing 在 Visual Basic 中)。 第二個額外的參數是用戶定義的物件。 這個物件可用來將應用程式特定狀態資訊傳遞至異步作完成時叫用的方法。 如果BeginOperationName方法接受其他作業特定的參數,例如用來儲存從檔案中讀取的位元組的位元組陣列,那麼AsyncCallback和應用程式狀態對象將是方法簽章中的BeginOperationName最後一個參數。
BeginOperationName 會立即將控制權傳回至呼叫端線程。 如果 BeginOperationName 方法擲回例外狀況,那麼例外狀況會在非同步操作啟動之前擲回。 如果 BeginOperationName 方法擲回例外狀況,則不會執行回呼方法。
結束非同步操作
方法會用來 EndOperationName 結束異步操作 OperationName。 方法的 EndOperationName 傳回值與其同步對應專案所傳回的型別相同,而且是異步作特有的類型。 例如, EndRead 方法會傳回從 FileStream 讀取的位元元組數目,而 EndGetHostByName 方法會傳回 IPHostEntry 物件,其中包含主計算機的相關信息。 方法 EndOperationName 會擷取方法同步版本簽章中宣告的任何 out 或 ref 參數。 除了同步方法的參數之外, EndOperationName 方法也包含 IAsyncResult 參數。 呼叫者必須傳遞由對應呼叫 BeginOperationName 傳回的實例。
如果由IAsyncResult物件所代表的異步操作在呼叫EndOperationName時尚未完成,EndOperationName會封鎖呼叫線程,直到異步操作完成。 異步操作擲回的例外狀況會從 EndOperationName 方法擲回。 未定義以相同EndOperationName方式呼叫IAsyncResult方法多次的效果。 同樣地,使用沒有由相關 Begin 方法傳回的 EndOperationName 來呼叫 IAsyncResult 方法的行為也是未定義的。
備註
針對任一未定義的情境,開發者應考慮拋出InvalidOperationException。
備註
此設計模式的實作者應通知呼叫端異步作已完成,方法是將 設定 IsCompleted 為 true、呼叫異步回呼方法(如果已指定),併發出訊 AsyncWaitHandle號。
應用程式開發人員有數個設計選擇來存取異步作的結果。 正確的選擇取決於應用程式是否有可在作業完成時執行的指示。 如果應用程式在收到異步作的結果之前,無法執行任何其他工作,應用程式必須封鎖,直到結果可用為止。 若要封鎖直到異步操作完成,您可以使用以下方法之一:
從應用程式的主線程呼叫
EndOperationName,封鎖應用程式執行,直到作業完成為止。 如需說明這項技術的範例,請參閱 結束異步作業來封鎖應用程式執行。AsyncWaitHandle使用 來封鎖應用程式執行,直到一或多個作業完成為止。 如需說明這項技術的範例,請參閱 使用 AsyncWaitHandle 封鎖應用程式執行。
異步作完成時不需要封鎖的應用程式可以使用下列其中一種方法:
為了輪詢作業完成狀態,請定期檢查IsCompleted 屬性,並在作業完成時呼叫
EndOperationName。 如需說明這項技術的範例,請參閱輪詢異步作業狀態。使用AsyncCallback委派來指定在作業完成時要叫用的方法。 如需說明這項技術的範例,請參閱 使用 AsyncCallback 委派結束異步操作。