.net中提供了執行非同步操作的三種模式
非同步程式設計模型 (apm) 模式(也稱為 iasyncresult
模式),這是使用 iasyncresult
介面提供非同步行為的舊模型。 在這種模式下,同步操作需要begin
和end
方法(例如,beginwrite
和endwrite
以實現非同步寫入操作)。 現在微軟不建議新的開發使用此模式。
基於事件的非同步模式 (eap),是提供非同步行為的基於事件的舊模型。 這種模式需要字尾為async
的方法,以及乙個或多個事件、事件處理程式委託型別和eventarg
派生型別。 eap 是在 .net framework 2.0 中引入的。 現在微軟不建議新開發中使用這種模式。
基於任務的非同步模式 (tap),該模式使用單一方法表示非同步操作的開始和完成。 tap 是在 .net framework 4 中引入的。 這是在 .net 中進行非同步程式設計的推薦方法。
從.net framework1.0開始,.net中提供了非同步屬性,而且內建類當中許多類實現了一種或多種非同步模式,例如發出http請求並獲取返回結果的同步和非同步api則是乙個例子。
下面這個類為webclient的同步版本。下面的**片段中,downloadstring發出乙個http請求並將將響應內容賦值給了乙個字串,將該字串寫在控制台上,該**在執行過程中會等待downloadstring方法執行完之後再執行下面的**
private執行結果如下const
string url = "
";private
static
void
synchronizedapi()
console.writeline();
}
方法downloadstring會阻塞呼叫程序,呼叫的應用程式會無響應直到返回想對應的結果。
一般情況下,在.net中非同步模式定義了begin***和end***方法。begin***方法接受其同步方法的所有輸入引數,end***方法使用了同步方法的所有輸出引數,並按照同步方法的返回型別來返回結果。begin***方法定義了乙個asynccallback引數
用於接受非同步方法執行完成後呼叫的委託,begin***方法返回iasyncresult,用於驗證呼叫是否完成,並且一直等到方法的執行結束。
對於webclient類並沒有對應的非同步模式的實現,此處示例使用的是webrequest類來代替,該類通過begingetrespond和endgetrespond方法提供非同步模式。在下面的**片段中begingetresponse將非同步http get請求發到伺服器上,一旦網路請求完成則呼叫本地readresponse方法。
private對於同步方法downloadstring,webclient類提供了乙個非同步變體方法downloadstringasync。以下**演示基於事件的非同步模式,當請求完成時會觸發downloadstringcompleted事件,該事件的第二個引數是downloadstringcompleteeventargs型別,這個型別通過resultstatic
void
asynchronouspattern()}}
屬性返回結果字串。使用downloadstringcompleted事件,事件處理程式將通過儲存同步上下文的執行緒來呼叫,在windform等程式中這就是ui執行緒。
private基於事件的非同步模式和同步程式設計之間的區別在於方法的呼叫的順序,與同步方法的呼叫相比,順序被顛倒了,呼叫非同步方法之前需要定義這個方法完成時會發生什麼。static
void
eventbasedasyncpattern()
;client.downloadstringasync(
newuri(url));
console.writeline();}}
在.net framework4.5及以後,對於同步方法downloadstring,webclient類提供了乙個非同步變體方法downloadstringtaskasync,該方法宣告為返回task,但是不需要宣告task變數,只要宣告string型別變數並使用await關鍵字。
await關鍵字會解除執行緒(這裡是ui執行緒)的阻塞,完成其他任務,當downloadstringtaskasync方法完成後其後台處理後,ui執行緒則可以繼續,從任務中獲得結果,然後執行await關鍵字之後的**。
private static async task main()執行結果如下private static async task taskbasedasyncpatternasync()
}
基於任務的非同步模式,編譯器上會通過task任務的形式去實現非同步模式,await和async關鍵字是編譯器功能,編譯器內部仍然通過task來實現對應的功能。從以上的執行結果我們可以看到
1.在async方法中遇到await關鍵字後,當前執行緒立即返回(到呼叫方),繼續之前的處理邏輯;await關鍵字之後的**邏輯,將交由新的執行緒處理;當新的執行緒處理完成後,可以從新的執行緒返回處理結果到呼叫(處)執行緒當中,結束等待。
2.在乙個async方法中,會根據await關鍵字進行分割,拆分到不同的執行緒處理同乙個方法的不同部分!
3.把乙個方法**的不同部分拆分到多個執行緒處理,這是非同步方法和同步方法的最大不同!
C 非同步程式設計模式IAsyncResult
iasyncresult 非同步設計模式通過名為 beginoperationname 和 endoperationname 的兩個方法來實現原同步方法的非同步呼叫,如 filestream 類提供了 beginread 和 endread 方法來從檔案非同步讀取位元組,它們是 read 方法的非同...
c 非同步呼叫(非同步模式,基於事件)
c 非同步呼叫之非同步模式 funcdownloadstring address,req client.credentials req.credentials client.encoding system.text.encoding.utf8 return client.downloadstring...
非同步模組模式
非同步模組模式amd是當請求發出後,繼續其他業務邏輯,直到模組載入完成執行後續邏輯,實現模組開發中的對模組載入完成後的引用,大名鼎鼎的require.js就是以它為思想的,非同步模組模式不屬於一般定義的23種設計模式的範疇,而通常將其看作廣義上的架構型設計模式。非同步模組模式主要是用在瀏覽器環境中,...