非同步程式設計設計模式

2022-07-31 04:09:11 字數 2771 閱讀 6220

非同步操作通常用於執行完成時間可能較長的任務,如開啟大檔案、連線遠端計算機或查詢資料庫。非同步操作在主應用程式執行緒以外的執行緒中執行。應用程式呼叫方法非同步執行某個操作時,應用程式可在非同步方法執行其任務時繼續執行。

.net framework 為非同步操作提供兩種設計模式:

iasyncresult設計模式允許多種程式設計模型,但更加複雜不易學習,可提供大多數應用程式都不要求的靈活性。可能的話,類庫設計者應使用事件驅動模型實現非同步方法。在某些情況下,庫設計者還應實現基於iasyncresult的模型。

有關使用事件的非同步操作的文件,請參見基於事件的非同步模式概述。

.net framework 的許多方面都支援非同步程式設計功能,這些方面包括:

使用 iasyncresult 設計模式的非同步操作是通過名為 beginoperationname 和 endoperationname 的兩個方法來執行的,這兩個方法分別開始和結束非同步操作 operationname。例如,filestream 類提供 beginread 和 endread 方法來從檔案非同步讀取位元組。這兩個方法實現了 read 方法的非同步版本。

在呼叫 beginoperationname 後,應用程式可以繼續在呼叫執行緒上執行指令,同時非同步操作在另乙個執行緒上執行。每次呼叫 beginoperationname 時,應用程式還應呼叫 endoperationname 來獲取操作的結果。

begin operationname 方法開始非同步操作 operationname 並返回乙個實現iasyncresult介面的物件。iasyncresult物件儲存有關非同步操作的資訊。下表提供了有關非同步操作的資訊。

說明asyncstate

乙個可選的應用程式特定的物件,包含有關非同步操作的資訊。

asyncwaithandle

乙個 waithandle,可用來在非同步操作完成之前阻止應用程式執行。

completedsynchronously

乙個值,指示非同步操作是否是在用於呼叫 beginoperationname 的執行緒上完成,而不是在另乙個 threadpool 執行緒上完成。

iscompleted

乙個值,指示非同步操作是否已完成。

begin operationname 方法帶有該方法(由值傳遞或由引用傳遞)的同步版本的簽名中宣告的任何引數。beginoperationname 方法簽名中不包含任何輸出引數。beginoperationname 方法簽名另外還包括兩個引數。在這兩個引數中,第乙個引數定義乙個 asynccallback 委託,此委託引用在非同步操作完成時呼叫的方法。如果呼叫方不希望在操作完成後呼叫方法,它可以指定null(在 visual basic 中為nothing)。第二個引數是乙個使用者定義的物件。此物件可用來向非同步操作完成時呼叫的方法傳遞應用程式特定的狀態資訊。如果 beginoperationname 方法還帶有其他一些操作特定的引數(例如,乙個用於儲存從檔案讀取的位元組的位元組陣列),則asynccallback和應用程式狀態物件將是 beginoperationname 方法簽名中的最後兩個引數。

開始operationname 立即返回對呼叫執行緒的控制。如果 beginoperationname 方法引發異常,則會在開始非同步操作之前引發異常。如果 beginoperationname 方法引發異常,則意味著沒有呼叫**方法。

end operationname 方法可結束非同步操作 operationname。endoperationname 方法的返回值與其同步副本的返回值型別相同,並且是特定於非同步操作的。例如,endread方法返回從filestream讀取的位元組數,endgethostbyname 方法返回包含有關主機的資訊的 iphostentry 物件。endoperationname 方法帶有該方法同步版本的簽名中宣告的所有輸出引數或引用引數。除了來自同步方法的引數外,endoperationname 方法還包括iasyncresult引數。呼叫方必須將對應呼叫返回的例項傳遞給 beginoperationname。

如果呼叫 endoperationname 時iasyncresult物件表示的非同步操作尚未完成,則 endoperationname 將在非同步操作完成之前阻止呼叫執行緒。非同步操作引發的異常是從 endoperationname 方法引發的。未定義多次使用同一iasyncresult呼叫 endoperationname 方法的效果。同樣,也未定義使用非相關的 begin 方法返回的iasyncresult呼叫 endoperationname 方法的效果。

對於這兩種未定義的情況,實施者應考慮引發 invalidoperationexception。

此設計模式的實施者應通知呼叫方非同步操作已通過以下步驟完成:將iscompleted設定為 true,呼叫非同步**方法(如果已指定乙個**方法),然後傳送asyncwaithandle訊號。

對於訪問非同步操作的結果,應用程式開發人員有若干種設計選擇。正確的選擇取決於應用程式是否有可以在操作完成時執行的指令。如果應用程式在接收到非同步操作結果之前不能進行任何其他工作,則必須先阻止該應用程式進行其他工作,等到獲得這些操作結果後再繼續進行。若要在非同步操作完成之前阻止應用程式,您可以使用下列方法之一:

在非同步操作完成時不需要阻止的應用程式可使用下列方法之一:

併發程式設計設計模式 Copy on Write模式

copy on write模式一種延時策略,只有在真正需要複製的時候才複製,而不是提前複製好,同時 copy on write 還支援按需複製.copy on write 最大的應用領域還是在函式式程式設計領域函式式程式設計的基礎是不可變性 immutability 所以函式式程式設計裡面所有的修改...

Java程式設計 設計模式之裝飾者模式

目錄簡介 做饅頭例項 ibread介面 normalbread類 abstractbread抽象類 sweetdecorator類 testdemo測試類 執行結果 生產汽車例項 icar介面 googlecar實現的類 增強汽車mycar類 測試類執行結果 裝飾者模式的主要功能就是對乙個類的功能進...

物件導向程式設計設計模式 設計模式分類和原則

其實與其說是設計模式的七大原則,不如說是物件導向的軟體開發的七大原則,因為這七大原則不僅僅是在設計模式中需要遵循,而是在軟體開發過程中都要盡量根據這七條原則來開發。這七條原則的目的是為了提高軟體系統的可維護性和可復用性,增加軟體的可拓展性和靈活性,從而提高開發效率,節約開發成本和維護成本。七大原則包...