首页 >后端开发 >C++ >何时以及为什么'async void”在 C# 中是一种不好的做法?

何时以及为什么'async void”在 C# 中是一种不好的做法?

Barbara Streisand
Barbara Streisand原创
2024-12-25 13:23:55714浏览

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

async void 何时以及为何被视为不良实践?

理解上下文:

C# 中的异步方法可以返回任务或无效。虽然 async void 方法在某些情况下看起来很方便,但它们引入了潜在的缺点,通常不鼓励使用它们。让我们来看看为什么 async void 被认为是不好的做法,以及如何更有效地处理这些情况。

避免 async void 的原因:

  1. 错误处理挑战:
    与 async Task 方法不同,从 async 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn