你真的會使用C#中的異步Void方法嗎?
當前位置:點晴教程→知識管理交流
→『 技術文檔交流 』
概述:async void對于許多開發人員來說,C# 中的方法是編寫異步 await 代碼時出現許多問題的根源。我們建議使用的模式當然是 ,但在某些情況下(例如 C# 中的事件處理程序),方法簽名不兼容。async Task在本文中,我將解釋為什么 C# 中的方法是你要避免的。我們將介紹一些比較和更好地理解的代碼示例,我還將解釋如果您別無選擇,只能執行 .async voidasync voidasync Taskasync voidC# 中的異步 void 方法是什么?在 C# 中,方法是一種定義不返回值的異步方法的方法。這些方法通常用于事件處理程序或其他方案,在這些方案中,強制實施的方法簽名不支 async void對于許多開發人員來說,C# 中的方法是編寫異步 await 代碼時出現許多問題的根源。我們建議使用的模式當然是 ,但在某些情況下(例如 C# 中的事件處理程序),方法簽名不兼容。async Task 在本文中,我將解釋為什么 C# 中的方法是你要避免的。我們將介紹一些比較和更好地理解的代碼示例,我還將解釋如果您別無選擇,只能執行 .async voidasync voidasync Taskasync void C# 中的異步 void 方法是什么?在 C# 中,方法是一種定義不返回值的異步方法的方法。這些方法通常用于事件處理程序或其他方案,在這些方案中,強制實施的方法簽名不支持返回類型,而是強制執行。async voidTaskvoid async void方法是在方法簽名之前使用關鍵字,后跟返回類型來定義方法。例如:asyncvoid
與返回 或 的常規異步方法相比,有一些重要的區別需要注意。當我說“重要”時,我的意思是“你真的需要盡可能地避免這種情況,這樣你就可以省去一些麻煩”。TaskTask<T> CSharp 中的異步 void 和異步任務之間的區別方法和方法之間的主要區別之一在于如何處理異常。async voidasync Task 在方法中,發生的任何異常都由返回的對象捕獲。這允許調用代碼處理異常或等待稍后觀察任何異常。這就是在 C# 中構建整個異步 await 基礎結構的方式。這通常就是為什么你會看到異步 await 被引入代碼庫,然后所有的調用代碼開始被轉換為異步 await 的原因——你真的希望它在那里。async TaskTaskTask 另一方面,方法不能直接等待,其中發生的任何異常都會冒泡到......哪里?首先啟動 async 方法的 SynchronizationContext。甚至Microsoft的Stephen Cleary在他的文章中也提到:async void
C 語言中 async Task 與 async void 方法的代碼示例#使用每種模式比較相同代碼布局的兩種變體,以了解問題是如何產生的,這將很有幫助。請考慮以下使用 async Task 的示例:
在此代碼中,如果事件處理程序方法中發生異常,則該異常將被方法中的 try-catch 塊捕獲,并且可以適當地處理。但是,如果定義為相反,則引發的任何異常都將繞過事件處理程序方法中的 catch 塊,并可能使應用程序崩潰:ProcessDataAsyncHandleButtonClickProcessDataAsyncasync voidProcessDataAsyncHandleButtonClick
C# 語言中異步 void 方法的危險你希望在本文中注意到的共同主題是,C# 中的方法是危險的,你應該盡量避免。以下是我們在使用方法時遇到的挑戰列表,希望能引導您遠離使用它們(除非您別無選擇):async voidasync void
在 C# 語言中處理異步 void 方法的最佳實踐在 C# 中使用異步 void 方法時,請務必了解它們的潛在危險并遵循最佳實踐,以確保代碼庫健壯可靠。以下是謹慎處理異步 void 方法的一些建議:
C# 中異步 void 方法的 Try/Catch我之前寫過幾種不同的方法來嘗試使用這種代碼,但最終感覺確保將每個方法主體包裝在 try/catch 中是最直接的。也許有人可以創建一個 Rosyln 分析器來強制執行這一點?async void 下面是一個示例,演示了如何在整個代碼主體中使用 try-catch:async void
通過遵守這些最佳實踐,您可以降低與方法相關的風險,并避免一堆永無止境的頭痛。請記住,盡可能優先使用方法,以便更好地處理異常并控制異步執行流 - 除非是絕對的最后手段,_否則您真的_不想在任何地方添加。async voidasync Taskasync void 由于多種原因,C# 中的方法可能很危險,您需要優先考慮不使用它們。在某些情況下,API 和方法簽名(例如事件處理程序)不一致,但除此之外,請盡最大努力避免這些情況。 通過使用 ,我們失去了正確等待或處理異常的能力。這可能會導致代碼中出現未經處理的異常和意外行為。為了避免這些危險,我建議您盡可能使用旨在異步的方法。這使我們能夠等待結果,處理異常,并更好地控制代碼的執行流。它促進了更好的錯誤處理并提高了整體代碼質量。當您別無選擇時,請確保將整個異步 void 方法包裝在 try/catch 中,并投資于適當的錯誤處理/日志記錄/報告。 該文章在 2024/6/5 23:58:42 編輯過 |
關鍵字查詢
相關文章
正在查詢... |