13

我想提供一种基于任务的异步模式样式方法。在等待该方法时,我找不到这两种提供该方法的方式之间的任何区别:

// 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?

上面的方法似乎比下面的方法开销少。在查看 MSDN 博客时,我注意到他们似乎使用了 lower 方法。(例如在这篇文章中

为什么?究竟有什么区别?它们似乎都有效。

4

2 回答 2

12

它们在逻辑上都是相同的,但第二个开销更大,因此不推荐使用。

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

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

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

于 2012-08-14T12:37:20.730 回答
4

我的印象是实现 TAP 模式的正确方法如下:

  public Task<IResult> GetLongWindedTaskResult(){
          var tcs = new TaskCompletionSource<IResult>();
            try
            {
               tcs.SetResult(ResultOFSomeFunction());
            }
            catch (Exception exp)
            {
                tcs.SetException(exp);
            }
            return tcs.Task;
}

这种方式可确保您在抛出异常时正确获得异常,并且如果需要,它可以更轻松地实现取消方法。

于 2016-08-17T18:45:17.573 回答