這是一個常識,我們不應該async void在我們的代碼周圍的正常方法上使用,但有一些例外,例如 winforms(或 WPF)組件的 EventHandlers:
public async void OnButtonClicked(object sender, EventArgs args)
{
await DoSomethingAsync();
}
但這樣做的后果是什么?
button.OnClick = async (obj, e) => await AsyncTaskButtonClickEvent(obj ,e);
async Task AsyncTaskButtonClickEvent(object sender, EventArgs args) { }
...
uj5u.com熱心網友回復:
在您的第二個示例中,您創建了一個呼叫具有完全相同簽名的方法的 lambda,這沒有多大意義。也許你打算讓它像下面這樣:
button.OnClick = async (obj, e) => await DoSomethingAsync();
假設您這樣做了,唯一的區別是您正在比較方法與 lambda。我建議閱讀C# Lambda 運算式:我為什么要使用它們?了解差異。
uj5u.com熱心網友回復:
async void在事件處理程式中使用是唯一的方法。這幾乎就是允許 async void 的原因,因此您可以將事件處理程式連接到異步方法。async Task鑒于事件處理程式委托簽名是這樣的,使用將導致編譯器錯誤:
public delegate void EventHandler(object sender, EventArgs e);
您還應該看看這兩篇文章,因為異步事件處理程式經常會出現問題,例如死鎖:
Async/Await - 異步編程的最佳實踐
https://blog.stephencleary.com/2012/07/dont-block-on-async-code.html
uj5u.com熱心網友回復:
兩者是等效的 BUT。這async void是一個眾所周知的“蟲巢”。如果您一直采用異步方式,并且遇到兩個執行緒同時訪問某些內容的問題,您可能希望從正則運算式搜索“async void”開始除錯。第一個示例將直接引導您找到源代碼。第二個完全沒有。我更喜歡第一個,因為它帶有危險標志。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/361535.html
下一篇:單擊按鈕時隱藏所有標記的游戲物件
