摘要: 在一个库方法中,何时应该使用async
和await
关键字而不是直接返回Task
?
我认为我的问题与这个问题有关。然而,那个问题是关于.NET 4.0
和TPL的,而我正在使用带有async
和await
关键字的.NET 4.6。因此,我认为我的问题可能会得到不同的答案,因为这些关键字在回答链接的问题时不存在。
说明:我正在为外部WCF服务编写一个简单的包装器,该包装器进行多个SendAsync
调用。现在我认为每个包装器方法都应该直接返回Task<>
而不被等待。我的理解是应该在应用程序层使用async
/await
,而不是在库中使用。
所以,例如,这是我认为我应该采取的每个包装器方法的方法:
private Task<SignResponse> GetSignDataAsync(SigningRequestType request)
{
return _service.SendAsync(request);
}
但是在互联网上,我发现有几篇文章使用了这种方法:
private async Task<SignResponse> GetSignDataAsync(SigningRequestType request)
{
return await _service.SendAsync(request).ConfigureAwait(false);
}
这里是我在technet上找到的另一个例子:
async Task PutTaskDelay()
{
await Task.Delay(5000);
}
private async void btnTaskDelay_Click(object sender, EventArgs e)
{
await PutTaskDelay();
MessageBox.Show("I am back");
}
那么,什么时候应该使用第二种方法(包括async
和await
关键字)?为什么不只返回整个 Task
,而不让PutTaskDelay
成为async
呢?我认为只要可能就直接返回Task
,并且仅在应用程序层使用async
/await
来获得最终结果。如果我错了,那么这两种方法之间有什么区别?
我的担忧: 当使用async
和await
关键字时,似乎它只是为编译器提供额外的工作而没有任何好处。
async
/await
是您方法的实现细节。对于您的调用方来说,声明async Task Method()
或仅Task Method()
并不重要。事实上,您可以在以后的时间点之间自由切换这两个选项,而不被视为破坏性更改。 - Damien_The_UnbelieverSignAsync
改为SendAsync
。希望这符合你的意图。 - DavidRRSignAsync
时,我指的是async Sign
方法,因为我调用它在某些认证中心为字节数组获取数字签名。但我不会编辑这篇文章,因为方法名称Sign
或Send
并不重要。我认为意图实际上得到了保留,所以我只是感谢您做得很好 :) - Alex ZhukovskiySendAsync
或SignAsync
的使用并不是你问题的核心。我们的评论应该能够消除任何可能因为寻找SendAsync
或SignAsync
而产生的困惑。 - DavidRR