异步方法:return await
与直接返回 Task<T>
的比较——何时需要 await
?
在异步编程中,您可以编写返回 Task<T>
的方法,方法是使用 return await
的异步方法,或者直接返回 Task<T>
对象的普通方法。虽然大多数情况下这两种方法在功能上是等效的,但在某些特定场景中,使用 return await
的异步方法是必要的。
一个关键的区别在于在带有 using
语句的 try
块中使用这些方法时。考虑以下两种方法:
<code class="language-csharp">Task<someresult> DoSomethingAsync() { using (var foo = new Foo()) { return foo.DoAnotherThingAsync(); } } async Task<someresult> DoSomethingAsync() { using (var foo = new Foo()) { return await foo.DoAnotherThingAsync(); } }</code>
在第一种方法中,Foo
对象会在 DoAnotherThingAsync()
返回后立即被释放。但是,这可能发生在 DoAnotherThingAsync()
实际完成之前很久。因此,由于过早释放 Foo
,第一种版本可能存在错误。
相反,第二种使用 await
的方法确保只有在 DoAnotherThingAsync()
完成其任务后才释放 Foo
对象。这提供了预期的行为。
因此,当您需要确保在涉及实现 IDisposable
或类似接口的对象的异步操作中正确释放或管理某些资源时,务必使用带有 return await
的异步方法。
以上是异步方法:'返回等待”与直接返回``任务' - 何时需要`'的详细内容。更多信息请关注PHP中文网其他相关文章!