使用iasyncresult
設計模式的非同步操作是通過名為beginoperationname
和endoperationname
的兩個方法來實現的,這兩個方法分別開始和結束非同步操作operationname
。 例如,filestream
類提供beginread
和endread
方法來從檔案非同步讀取位元組。 這兩個方法實現了read
方法的非同步版本。
在呼叫beginoperationname
後,應用程式可以繼續在呼叫執行緒上執行指令,同時非同步操作在另乙個執行緒上執行。 每次呼叫beginoperationname
時,應用程式還應呼叫endoperationname
來獲取操作的結果。
beginoperationname
方法開始非同步操作operationname
,並返回實現iasyncresult
介面的物件。iasyncresult
物件儲存有關非同步操作的資訊。 下表顯示有關非同步操作的資訊。
成員說明
asyncstate
乙個特定於應用程式的可選物件,其中包含有關非同步操作的資訊。
asyncwaithandle
乙個 waithandle ,可用來在非同步操作完成之前阻止應用程式執行。
completedsynchronously
乙個值,指示非同步操作是否是在用於呼叫 beginoperationname 的執行緒上完成,而不是在單獨的 threadpool 執行緒上完成。
iscompleted
乙個值,指示非同步操作是否已完成。
beginoperationname
方法簽名中不包含任何輸出引數。beginoperationname
方法簽名另外還包括兩個其他引數。
第乙個引數定義乙個 asynccallback 委託,此委託引用在非同步操作完成時呼叫的方法。 如果呼叫方不希望在操作完成後呼叫方法,它可以指定null
。
第二個引數是乙個使用者定義的物件。 此物件可用來向非同步操作完成時呼叫的方法傳遞應用程式特定的狀態資訊。 如果beginoperationname
方法還採用其他一些操作特定的引數(例如,乙個用於儲存從檔案讀取的位元組的位元組陣列),則asynccallback
和應用程式狀態物件
將是beginoperationname
方法簽名中的最後兩個引數。
beginoperationname
立即返回對呼叫執行緒的控制。 如果beginoperationname
方法引發異常,則會在開始非同步操作之前引發異常。 如果beginoperationname
方法引發異常,則意味著沒有呼叫**方法。
endoperationname
方法用於結束非同步操作operationname
。endoperationname
方法的返回值與其同步對應方法的返回值型別相同,並且是特定於非同步操作的。 除了來自同步方法的引數外,endoperationname
方法還包括iasyncresult
引數。 呼叫方必須將對應呼叫返回的例項傳遞給beginoperationname
。
如果呼叫iasyncresult
時endoperationname
物件表示的非同步操作尚未完成,則endoperationname
將在非同步操作完成之前阻止呼叫執行緒。
對於訪問非同步操作的結果,應用程式開發人員有若干種設計選擇。 正確的選擇取決於應用程式是否有可以在操作完成時執行的指令。 如果應用程式在接收到非同步操作結果之前不能進行任何其他工作,則必須在獲得這些結果之前先阻止該應用程式進行其他工作。 若要在非同步操作完成之前阻止應用程式,可以使用下列方法之一:
在非同步操作完成時不需要阻止的應用程式可使用下列方法之一:
非同步程式設計模型 APM
原文 apm是.net中非同步程式設計模型的縮寫 asynchronous programing model 通過非同步程式設計,使得我們的程式可以更加高效的利用系統資源.1.apm例子 net中的非同步模型非常完善,只要看到begin 者end 方法。基本都是相對 方法的非同步呼叫方式。注 是方法...
網路程式設計之IO模型 非同步IO
linux下的asynchronous io其實用得不多,從核心2.6版本才開始引入。先看一下它的流程 使用者程序發起read操作之後,立刻就可以開始去做其它的事。而另一方面,從kernel的角度,當它受到乙個asynchronous read之後,首先它會立刻返回,所以不會對使用者程序產生任何bl...
非同步選擇模型
非同步選擇 wsaasyncselect 模型是乙個有用的非同步 i o 模型。利用這個模型,應用程式可在乙個套接字上,接收以 windows 訊息為基礎的網路事件通知。具體 的做法是在建好乙個套接字後,呼叫wsaasyncselect函式。該模型的核心即是wsaasyncselect函式。wsaa...