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