1. 程式人生 > >C#非同步程式設計與多執行緒程式設計

C#非同步程式設計與多執行緒程式設計

C#5.0推出了非同步程式設計,通過關鍵字async 和 await及返回型別為Task(無返回值的非同步方法)和Task(返回值為T的非同步方法)可以將方法封裝為非同步方法。呼叫非同步方法時,遇到await關鍵字程式會立即返回到呼叫者,直到await後的方法執行完成。包括兩種非同步方式:I/O繫結程式碼、CPU繫結程式碼

I/O 繫結示例:從 Web 服務下載資料

你可能需要在按下按鈕時從 Web 服務下載某些資料,但不希望阻止 UI 執行緒。 只需執行如下操作即可輕鬆實現:
C#
private readonly HttpClient _httpClient = new HttpClient();
downloadButton.Clicked += async (o, e) =>
{
// This line will yield control to the UI as the request
// from the web service is happening.
//
// The UI thread is now free to perform other work.
var stringData = await _httpClient.GetStringAsync(URL);
DoSomethingWithData(stringData);
};
就是這麼簡單! 程式碼表示目的(非同步下載某些資料),而不會在與任務物件的互動中停滯。
在整個過程中,關鍵點在於沒有執行緒專用於執行任務,即沒有使用額外的執行緒

。 儘管需要在一些上下文中執行工作(即,作業系統確實必須將資料傳遞到裝置驅動程式並響應中斷),但沒有專用於等待資料從請求返回的執行緒。 這讓系統能處理更多的工作而不是等待某些 I/O 呼叫結束。

CPU 繫結示例:為遊戲執行計算

假設你正在編寫一個移動遊戲,在該遊戲中,按下某個按鈕將會對螢幕中的許多敵人造成傷害。 執行傷害計算的開銷可能極大,而且在 UI 執行緒中執行計算有可能使遊戲在計算執行過程中暫停!
此問題的最佳解決方法是啟動一個後臺執行緒,它使用 Task.Run 執行工作,並 await 其結果。 這可確保在執行工作時 UI 能流暢執行。
C#
private DamageResult CalculateDamageDone()
{
// Code omitted:
//
// Does an expensive calculation and returns
// the result of that calculation.
}
calculateButton.Clicked += async (o, e) =>
{
// This line will yield control to the UI while CalculateDamageDone()
// performs its work. The UI thread is free to perform other work.
var damageResult = await Task.Run(() => CalculateDamageDone());
DisplayDamage(damageResult);
};
可見CPU繫結時是通過額外開執行緒來實現非同步的,即多執行緒。

非同步程式設計與多執行緒的區別

多執行緒和非同步程式設計是兩個不同的概念。多執行緒的應用場景是針對同時有多個任務需要處理的情形;非同步程式設計針對的是同步程式設計導致的執行緒阻塞的場景。
非同步程式設計的CPU程式碼繫結通過多執行緒來實現。
更多關於多執行緒的文章收藏:https://www.cnblogs.com/yunfeifei/p/4106318.html