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>
在这个例子中,async
和 await
关键字是不必要的,因为不需要显式处理异常。但是,如果发生异常,它将不会被观察到,并且可能无法正确处理。
异常处理示例
为了演示 Task
和 void
异步方法之间异常处理的差异,请考虑以下代码:
<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中文网其他相关文章!