讀【C#併發編程經典實例.PDF】一書總結: 1、併發:同時做多件事。 2、多線程:併發的一種形式,它採用多個線程來執行程式。所以多線程只是實現併發的一種方法,併發不等於多線程。 3、並行處理:把正在執行的大量任務分隔成小塊,分配給多個正在運行的線程。 並行處理是多線程的一種,多線程是併發的一種。 ...
讀【C#併發編程經典實例.PDF】一書總結:
1、併發:同時做多件事。
2、多線程:併發的一種形式,它採用多個線程來執行程式。所以多線程只是實現併發的一種方法,併發不等於多線程。
3、並行處理:把正在執行的大量任務分隔成小塊,分配給多個正在運行的線程。 並行處理是多線程的一種,多線程是併發的一種。
4、非同步編程:併發的一種形式,採用 future 形式或者回調機制,以避免產生不必要的線程。在.net,新版的future 類型有Task和Task<TResult>。在舊版中,採用回調或事件(event)。
非同步編程的核心是非同步操作:啟動了的才做將會在一段時間後完成。這個操作正在執行時不會阻塞原來的線程。啟動了這個操作的線程可以執行其他任務。當操作結束時,會通知他的future,或者調用回調函數,以便讓程式知道任務已執行完成。
使用 async 和 await,使非同步編程變得簡單。
await關鍵字的作用:啟動一個將被執行的任務(該任務會在新線程裡面執行),並立即返回。所以await所在的函數不會被阻塞。當任務完成後,繼續執行await關鍵字後面的代碼。
async關鍵字的作用:主要目的是使用方法內的await關鍵字生效。如果async 方法有返回值,應返回Task<T>;如果沒有返回值,應返回Task。這寫task相當於future,用於在非同步方法結束時,通知主程式
async方法可以返回void,應該只限於在編寫事件處理程式時。
async方法由多個同步執行的程式塊組成。第一個同步塊由調用該方法的線程執行。一般情況下,用await等待一個任務完成,當該任務在await出暫停,就可以捕獲上下文,UI線程採用UI上下文,
處理ASP.NET才有ASP.NET上下文,其他情況採用線程池上下文。
因此,每一個同步快都會試圖在原始的上下文中恢復運行。這樣造成了極小的性能耗損,要避免恢覆上下文,可以在await中使用 ConfigureAwait 方法,設置continueOnCapturedContext的值為false,
task任務完成後,將不會恢復前面的上下文。
最好的做法:在核心庫裡面一直使用ConfigureAwait 。在外面的用戶界面代碼中,只在需要時才恢覆上下文。
非同步編程的好處:
1、對應面向用戶的GUI程式,非同步編程提高了響應能力。
2、對於服務端程式,非同步編程提供了擴展力。