如何正确实现TAP方法?

nik*_*eee 12 .net c# task-parallel-library async-await

我想提供一个基于任务的异步模式样式方法.在等待该方法时,我发现这两种提供方法的方法之间没有任何区别:

// GetStats is a delegate for a void method in this example
public Task GetStatsAsync()
{
    return Task.Run(GetStats);
}

public async Task GetStatsAsync()
{
    return await Task.Run(GetStats);
}

// Usage:
await GetStatsAsync();
// Difference?
Run Code Online (Sandbox Code Playgroud)

上层方法似乎比下层方法具有更少的开销.在查看MSDN博客时,我注意到他们似乎使用较低的方法.(例如,在本文中)

为什么?究竟有什么区别?他们似乎都工作.

Ste*_*ary 11

这些在逻辑上是相同的,但第二个有更多的开销,因此不推荐.

您可能会发现我的async介绍很有,以及基于任务的异步模式文档.

有关开销的更多信息async,我推荐Stephen ToubZen of Async.

您可能还想阅读"我应该为同步方法公开异步包装吗?" 简而言之,答案是"不".

  • 第一个也不推荐!让调用者选择是否要在线程池上运行.只需将Task.Run放在那里就不会使算法神奇地无阻塞. (2认同)
  • 对于那些对最后一个链接(现在已损坏)感到好奇的人:https://devblogs.microsoft.com/pfxteam/should-i-expose-asynchronous-wrappers-for-synchronous-methods/ (2认同)