首頁 > 後端開發 > C++ > 何時以及為什麼「async void」在 C# 中是一種不好的做法?

何時以及為什麼「async void」在 C# 中是一種不好的做法?

Barbara Streisand
發布: 2024-12-25 13:23:55
原創
655 人瀏覽過

When and Why Is `async void` a Bad Practice in C#?

async void 何時以及為何被視為不良實踐?

理解上下文:

C# 中的非同步方法可以傳回任務或無效。雖然 async void 方法在某些情況下看起來很方便,但它們引入了潛在的缺點,通常不鼓勵使用它們。讓我們來看看為什麼 async void 被認為是不好的做法,以及如何更有效地處理這些情況。

避免async void 的原因:

  1. 錯誤處理挑戰:
    與async Task 方法不同,從asyncoid void 方法轉義的異常有非常規的錯誤處理語義,使得正確處理它們變得具有挑戰性。
  2. 組合挑戰:
    Async void 方法無法輕鬆組合為更高等級的非同步方法。這限制了程式碼的可維護性和重用。
  3. 測試困難:
    由於獨特的錯誤處理和組合語義,單元測試 async void 方法比測試 async Task方法要複雜得多.

替代方案方法:

在提供的範例中,重點在於對按鈕點擊做出反應而不等待結果,更合適的方法是將PrimeCustomTask 方法定義為非同步任務,並利用OnLoad 方法作為啟動非同步操作的入口點。這樣,就保留了async Task 方法的所有優點:

protected override async void OnLoad(EventArgs e)
{
    if (CustomTask == null)
        await PrimeCustomTask();
}

private async Task PrimeCustomTask()
{
    CustomTask = new TaskCompletionSource<int>();
    while (CustomTask.Task.IsCompleted == false && IsDisposed == false) 
    {
        // Wait for button click to set the value
        await Task.Delay(100); 
    }

    int result = CustomTask.Task.Result;

    // Show the value
    if (result != 0) MessageBox.Show(result.ToString());
}
登入後複製

透過遵守這些準則,您可以避免async void 方法的陷阱,並提高程式碼的可維護性、可重用性和可測試性。

以上是何時以及為什麼「async void」在 C# 中是一種不好的做法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板