C# Async Programming的注意事項

更新 發佈閱讀 1 分鐘

以下是我在撰寫 C# Async Programming 會關注到的事項,我也是從別人的經驗學來的,也許值得參考。

全面擁抱異步

  • 一旦開始使用 async/await,就應該讓整個應用程序都使用異步模式。
  • 避免混合同步和異步代碼,這可能導致性能問題和 Deadlock。
    • 性能問題:因為 Calling Thread 沒有被釋放。導致桌面應用程式的 UI 凍結;導致 ASP .NET Core 不能服務更多的請求。
    • Deadlock:互相的等待對方釋放資源,造成程式卡住,不會執行後續的程式碼。
// 好的做法
public async Task<int> DoSomethingAsync()
{
var result = await CallDependencyAsync();
return result + 1;
}

// 避免這樣做
public int DoSomething()
{
var result = CallDependencyAsync().Result; // 可能導致死鎖
return result + 1;
}

避免使用 async void

  • 異步方法總是返回 Task 或 Task<T>,而不是 void。
  • async void 可能導致未處理的異常,造成應用程序崩潰。
// 好的做法
public async Task BackgroundOperationAsync()
{
var result = await CallDependencyAsync();
DoSomething(result);
}

// 避免這樣做
public async void BackgroundOperation() // 可能導致未捕獲的異常
{
var result = await CallDependencyAsync();
DoSomething(result);
}

絕不使用 Task.Result 或 Task.Wait

  • 這些方法可能在 UI 應用程序中造成 Deadlock,在服務器應用程序中導致線程池資源耗盡。
  • 始終使用 await 替代。
// 好的做法
public async Task<string> GetDataAsync()
{
var result = await FetchDataAsync();
return ProcessData(result);
}

// 避免這樣做
public string GetData()
{
var result = FetchDataAsync().Result; // 可能導致死鎖
return ProcessData(result);
}

正確傳遞 CancellationToken

將 CancellationToken 參數傳遞給支援的 API。

public async Task<string> DoAsyncThing(CancellationToken cancellationToken = default)
{
byte[] buffer = new byte[1024];
// 正確地將 cancellationToken 傳遞給 ReadAsync
int read = await _stream.ReadAsync(buffer, 0, buffer.Length, cancellationToken);
return Encoding.UTF8.GetString(buffer, 0, read);
}

優先使用 async/await 而非直接返回 Task

使用 async/await 提供更好的異常處理。

// 好的做法
public async Task<int> DoSomethingAsync()
{
return await CallDependencyAsync();
}

// 避免這樣做,除非有性能考慮
public Task<int> DoSomething()
{
return CallDependencyAsync();
}

優先使用 await,不要直接回傳 Task

沒有必要對 Task.FromResult 使用 await,因為這會增加不必要的開銷。

// 好的做法
public Task<int> GetValueAsync()
{
return Task.FromResult(42);
}

// 避免這樣做
public async Task<int> GetValueAsync()
{
return await Task.FromResult(42); // 不必要的 await
}
留言
avatar-img
留言分享你的想法!
avatar-img
C# 工匠的 DevOps 旅程
5會員
12內容數
專注於 C#, DevOps 的工程師
2024/06/24
Code Coverage 是什麼? 程式碼覆蓋率(Code Coverage)是一種軟體測試指標,用百分比表示,數值越高越好。
Thumbnail
2024/06/24
Code Coverage 是什麼? 程式碼覆蓋率(Code Coverage)是一種軟體測試指標,用百分比表示,數值越高越好。
Thumbnail
2024/04/08
本文介紹瞭如何在C#專案中建立和使用packages.lock.json檔案,以確保每次執行dotnet restore時都可以獲得相同的packages集合。我們還討論了dotnet restore抓取不同packages的原因,並提供了相關的解決方案。
Thumbnail
2024/04/08
本文介紹瞭如何在C#專案中建立和使用packages.lock.json檔案,以確保每次執行dotnet restore時都可以獲得相同的packages集合。我們還討論了dotnet restore抓取不同packages的原因,並提供了相關的解決方案。
Thumbnail
2024/02/20
Semgrep 是一個功能強大的 SAST 工具,可以幫助開發人員早期發現程式碼中的安全問題,本文介紹如何將 Semgrep 整合到 GitLab Pipeline 以進行 SAST 掃描。
Thumbnail
2024/02/20
Semgrep 是一個功能強大的 SAST 工具,可以幫助開發人員早期發現程式碼中的安全問題,本文介紹如何將 Semgrep 整合到 GitLab Pipeline 以進行 SAST 掃描。
Thumbnail
看更多
你可能也想看
Thumbnail
避免 thread 競速(Race Condition)是多執行緒編程中常見的挑戰之一。 Race Condition 發生在多個執行緒同時訪問和修改共享資源時,因為執行緒之間的執行順序無法預測,可能會導致數據的不一致性或意外行為。 本文主要介紹如何使用Lock來避免此狀況出現。 首先先看沒
Thumbnail
避免 thread 競速(Race Condition)是多執行緒編程中常見的挑戰之一。 Race Condition 發生在多個執行緒同時訪問和修改共享資源時,因為執行緒之間的執行順序無法預測,可能會導致數據的不一致性或意外行為。 本文主要介紹如何使用Lock來避免此狀況出現。 首先先看沒
Thumbnail
在網路速度有限的情況下,依序記錄不斷產生的資訊,能統計使用者在頁面上操作了哪些功能。
Thumbnail
在網路速度有限的情況下,依序記錄不斷產生的資訊,能統計使用者在頁面上操作了哪些功能。
Thumbnail
分享一個有趣的套件,名為 await-to-js。 可以讓 Promise 與 await 的寫法更簡潔。
Thumbnail
分享一個有趣的套件,名為 await-to-js。 可以讓 Promise 與 await 的寫法更簡潔。
Thumbnail
簡要說明 JavaScript 的 Event Loop JavaScript 是單執行緒 (single-threaded) 語言,這意味著它一次只能執行一件事,因此所有函式都需要排隊等待執行,這被稱為同步 (synchronous)。在同步操作中,若函式過多或過於複雜,會導致程式阻塞 (blo
Thumbnail
簡要說明 JavaScript 的 Event Loop JavaScript 是單執行緒 (single-threaded) 語言,這意味著它一次只能執行一件事,因此所有函式都需要排隊等待執行,這被稱為同步 (synchronous)。在同步操作中,若函式過多或過於複雜,會導致程式阻塞 (blo
Thumbnail
本文是C#入門教程的一部分,涵蓋了流程控制的各種語句與迴圈。這包括if、else if和else語句,三元運算子,switch語句,以及for、foreach和while迴圈。文中還介紹了如何在迴圈中使用break、continue、return和goto語句。
Thumbnail
本文是C#入門教程的一部分,涵蓋了流程控制的各種語句與迴圈。這包括if、else if和else語句,三元運算子,switch語句,以及for、foreach和while迴圈。文中還介紹了如何在迴圈中使用break、continue、return和goto語句。
Thumbnail
C#是一種開源、跨平台、面向對象的編程語言,具有類型安全、泛型、模式匹配等特性。廣泛應用於桌面和Web應用程序、遊戲開發、移動應用、雲計算等領域。全球數十萬家公司像微軟、Unity Technologies、Stack Overflow等使用C#支持其業務。C#還提供豐富的進階學習資源和主題。
Thumbnail
C#是一種開源、跨平台、面向對象的編程語言,具有類型安全、泛型、模式匹配等特性。廣泛應用於桌面和Web應用程序、遊戲開發、移動應用、雲計算等領域。全球數十萬家公司像微軟、Unity Technologies、Stack Overflow等使用C#支持其業務。C#還提供豐富的進階學習資源和主題。
Thumbnail
列出一套完整的程式 程式設計有許多種方法,不過通常會先列出清單的再逐一執行,這樣會加快程式設計的速度。設計通常會採取順推的辦法。所以順推的程式設計方式就是經歷觀念溝通、系統分析、資料統合、權限管理、頻率與時間、後台管理、畫面設計等等階段後,將框架設計完了以後,先列出一套完整的程式,將所有使用者都確
Thumbnail
列出一套完整的程式 程式設計有許多種方法,不過通常會先列出清單的再逐一執行,這樣會加快程式設計的速度。設計通常會採取順推的辦法。所以順推的程式設計方式就是經歷觀念溝通、系統分析、資料統合、權限管理、頻率與時間、後台管理、畫面設計等等階段後,將框架設計完了以後,先列出一套完整的程式,將所有使用者都確
Thumbnail
確保沒有遺漏或錯誤 程式的完整資訊資料對於程式設計至關重要。這是因為只有透過完整的資訊,我們才能確保在程式設計中沒有任何遺漏或錯誤。最終,後台管理扮演著管理系統中所有動作和行為是否符合特定標準的重要角色。 採取不符合預期的行動 這種符合性的重要性在於,當我們設計程式時,希望使用者按照預期的方式
Thumbnail
確保沒有遺漏或錯誤 程式的完整資訊資料對於程式設計至關重要。這是因為只有透過完整的資訊,我們才能確保在程式設計中沒有任何遺漏或錯誤。最終,後台管理扮演著管理系統中所有動作和行為是否符合特定標準的重要角色。 採取不符合預期的行動 這種符合性的重要性在於,當我們設計程式時,希望使用者按照預期的方式
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News