狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

你真的會(huì)使用C#中的異步Void方法嗎?

admin
2024年6月5日 23:58 本文熱度 1544

概述:async void對(duì)于許多開(kāi)發(fā)人員來(lái)說(shuō),C# 中的方法是編寫(xiě)異步 await 代碼時(shí)出現(xiàn)許多問(wèn)題的根源。我們建議使用的模式當(dāng)然是 ,但在某些情況下(例如 C# 中的事件處理程序),方法簽名不兼容。async Task在本文中,我將解釋為什么 C# 中的方法是你要避免的。我們將介紹一些比較和更好地理解的代碼示例,我還將解釋如果您別無(wú)選擇,只能執(zhí)行 .async voidasync voidasync Taskasync voidC# 中的異步 void 方法是什么?在 C# 中,方法是一種定義不返回值的異步方法的方法。這些方法通常用于事件處理程序或其他方案,在這些方案中,強(qiáng)制實(shí)施的方法簽名不支

async void對(duì)于許多開(kāi)發(fā)人員來(lái)說(shuō),C# 中的方法是編寫(xiě)異步 await 代碼時(shí)出現(xiàn)許多問(wè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

public async void SomeMethod()  
{  
   // Code here  
}

與返回 或 的常規(guī)異步方法相比,有一些重要的區(qū)別需要注意。當(dāng)我說(shuō)“重要”時(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)用代碼開(kāi)始被轉(zhuǎn)換為異步 await 的原因——你真的希望它在那里。async TaskTaskTask

另一方面,方法不能直接等待,其中發(fā)生的任何異常都會(huì)冒泡到......哪里?首先啟動(dòng) async 方法的 SynchronizationContext。甚至Microsoft的Stephen Cleary在他的文章中也提到:async void

使用異步 void 方法時(shí),沒(méi)有 Task 對(duì)象,因此從異步 void 方法引發(fā)的任何異常都將直接在異步 void 方法啟動(dòng)時(shí)處于活動(dòng)狀態(tài)的 SynchronizationContext 上引發(fā)。圖 2 說(shuō)明了無(wú)法自然捕獲從異步 void 方法引發(fā)的異常。

C 語(yǔ)言中 async Task 與 async void 方法的代碼示例#

使用每種模式比較相同代碼布局的兩種變體,以了解問(wèn)題是如何產(chǎn)生的,這將很有幫助。請(qǐng)考慮以下使用 async Task 的示例:

public async Task ProcessDataAsync()  
{  
   // Some asynchronous operations  
}  
 
public async void HandleButtonClick(object sender, EventArgs e)  
{  
   try  
   {  
       await ProcessDataAsync();  
   }  
   catch (Exception ex)  
   {  
       // Handle the exception  
   }  
}

在此代碼中,如果事件處理程序方法中發(fā)生異常,則該異常將被方法中的 try-catch 塊捕獲,并且可以適當(dāng)?shù)靥幚怼5牵绻x為相反,則引發(fā)的任何異常都將繞過(guò)事件處理程序方法中的 catch 塊,并可能使應(yīng)用程序崩潰:ProcessDataAsyncHandleButtonClickProcessDataAsyncasync voidProcessDataAsyncHandleButtonClick

public async void ProcessDataAsync()  
{  
   // Some asynchronous operations  
}  
 
public async void HandleButtonClick(object sender, EventArgs e)  
{  
   try  
   {  
       ProcessDataAsync();  
   }  
   catch (Exception ex)  
   {  
       // This will never catch the async exceptions!  
   }  
}

C# 語(yǔ)言中異步 void 方法的危險(xiǎn)

你希望在本文中注意到的共同主題是,C# 中的方法是危險(xiǎn)的,你應(yīng)該盡量避免。以下是我們?cè)谑褂梅椒〞r(shí)遇到的挑戰(zhàn)列表,希望能引導(dǎo)您遠(yuǎn)離使用它們(除非您別無(wú)選擇):async voidasync void

  1. 錯(cuò)誤傳播:方法不允許捕獲或傳播錯(cuò)誤。當(dāng)此類方法中發(fā)生異常時(shí),它會(huì)逃逸到同步上下文,這通常會(huì)導(dǎo)致未經(jīng)處理的異常,從而導(dǎo)致應(yīng)用程序崩潰。async void

  2. 等待行為:與方法不同,方法不能等待。這可能會(huì)導(dǎo)致控制異步操作流的問(wèn)題,從而可能導(dǎo)致?tīng)?zhēng)用條件或執(zhí)行超出預(yù)期順序的操作。async Taskasync void

  3. 調(diào)試難度:調(diào)試方法中的異常更具挑戰(zhàn)性,因?yàn)檎{(diào)用堆棧可能無(wú)法準(zhǔn)確表示引發(fā)異常時(shí)的執(zhí)行流,從而使識(shí)別和修復(fù) bug 的過(guò)程復(fù)雜化。async void

在 C# 語(yǔ)言中處理異步 void 方法的最佳實(shí)踐

在 C# 中使用異步 void 方法時(shí),請(qǐng)務(wù)必了解它們的潛在危險(xiǎn)并遵循最佳實(shí)踐,以確保代碼庫(kù)健壯可靠。以下是謹(jǐn)慎處理異步 void 方法的一些建議:

  1. 盡可能避免:通常應(yīng)避免使用方法,尤其是在異常處理和錯(cuò)誤恢復(fù)至關(guān)重要的情況下。雖然異步 void 方法可能看起來(lái)很方便,但它們?nèi)狈鞑ギ惓5哪芰Γ⑶铱赡軐?dǎo)致不可預(yù)測(cè)的程序行為。相反,請(qǐng)考慮使用提供更好錯(cuò)誤處理功能的方法。async voidasync voidasync Task

  2. 改用:通過(guò)對(duì)異步方法使用返回類型,可以利用 Task 的內(nèi)置異常處理機(jī)制。這使您能夠適當(dāng)?shù)夭东@和處理異常,從而確保代碼保持對(duì)執(zhí)行流的控制。使用方法還可以實(shí)現(xiàn)更好的代碼可維護(hù)性、可測(cè)試性,并且比 .async Taskasync Taskasync Taskasync void

  3. 處理方法中的異常:如果必須使用方法,請(qǐng)務(wù)必正確處理異常,以防止它們以靜默方式傳播并導(dǎo)致意外的系統(tǒng)行為。實(shí)現(xiàn)此目的的一種方法是將代碼包含在 try/catch 塊中。在 catch 塊中,您可以記錄異常并相應(yīng)地處理它,例如向用戶顯示錯(cuò)誤消息或回滾任何相關(guān)操作。async voidasync void

  4. 記錄和監(jiān)視異步操作:使用方法時(shí),日志記錄和監(jiān)視變得更加重要。由于這些方法沒(méi)有返回類型,因此確定其完成情況或識(shí)別任何潛在問(wèn)題變得具有挑戰(zhàn)性。實(shí)施可靠的日志記錄和監(jiān)視系統(tǒng)(例如使用 Serilog 等日志記錄框架或利用 Application Insights)可以幫助跟蹤異步操作的進(jìn)度和狀態(tài),從而幫助進(jìn)行調(diào)試和故障排除。async void

C# 中異步 void 方法的 Try/Catch

我之前寫(xiě)過(guò)幾種不同的方法來(lái)嘗試使用這種代碼,但最終感覺(jué)確保將每個(gè)方法主體包裝在 try/catch 中是最直接的。也許有人可以創(chuàng)建一個(gè) Rosyln 分析器來(lái)強(qiáng)制執(zhí)行這一點(diǎn)?async void

下面是一個(gè)示例,演示了如何在整個(gè)代碼主體中使用 try-catch:async void

public async void DoSomethingAsync()  
{  
   try  
   {  
       // Perform asynchronous operations  
       await Task.Delay(1000);  
       await SomeAsyncMethod();  
   }  
   catch (Exception ex)  
   {  
       // **TODO:** ... whatever you need to do to properly report  
       // on issues in your async void calls so that you  
       // can debug them more effectively.  
 
       // Log the exception and handle it appropriately  
       Logger.Error(ex, "An error occurred while executing DoSomethingAsync");  
       // Display an error message or take necessary action  
       DisplayErrorMessage("Oops! Something went wrong. Please try again later.");  
   }  
}

通過(guò)遵守這些最佳實(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)盡最大努力避免這些情況。

通過(guò)使用 ,我們失去了正確等待或處理異常的能力。這可能會(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ò)
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車(chē)隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved