首页 >后端开发 >C++ >异步/等待:我应该返回任务还是无效?

异步/等待:我应该返回任务还是无效?

Susan Sarandon
Susan Sarandon原创
2025-02-01 14:06:10370浏览

Async/Await: Should I Return a Task or Void?

Async/Await 方法的返回值:Task 还是 Void?

在异步编程中,async 方法的返回值是 Task 还是 void 会产生显着的影响。本文将探讨每种选择适用的场景。

返回 Task

通常情况下,async 方法应该返回 Task。这允许调用代码 await 该任务,并在必要时跟踪其进度。此规则的主要例外情况是当您明确需要 void 返回类型时,例如处理事件时。

返回 Void

使用 void 返回类型的 async 方法将其标记为“顶级异步操作”。这些操作在发生异常时的行为与众不同。与返回值的 Task 不同,void 异步方法中的异常默认情况下不会被观察到。它们会成为未处理的异常,并可能触发 TaskScheduler.UnobservedTaskException 处理程序。

考虑以下示例:

<code class="language-csharp">public static async void AsyncMethod2(int num)
{
    await Task.Factory.StartNew(() => Thread.Sleep(num));
}</code>

在这个例子中,asyncawait 关键字是不必要的,因为不需要显式处理异常。但是,如果发生异常,它将不会被观察到,并且可能无法正确处理。

异常处理示例

为了演示 Taskvoid 异步方法之间异常处理的差异,请考虑以下代码:

<code class="language-csharp">static async void f()
{
    await h();
}

static async Task g()
{
    await h();
}

static async Task h()
{
    throw new NotImplementedException();
}</code>

如果调用 f,则观察到异常并将其视为任何其他未处理的异常。但是,如果调用 g,则永远不会观察到异常,并且将由 TaskScheduler.UnobservedTaskException 处理程序处理,这将导致未定义的行为。

最佳实践

作为一般最佳实践,除非您明确需要 void 返回类型,否则始终从 async 方法返回 Task。这确保了异常被正确处理,并且调用者可以选择 await 该任务并跟踪其进度。

更多详细信息,请参考 Microsoft 关于 async/await 最佳实践的文档:https://www.php.cn/link/d3ddedd999aa150f47c2d0a55cb17898

以上是异步/等待:我应该返回任务还是无效?的详细内容。更多信息请关注PHP中文网其他相关文章!

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