繁体   English   中英

如何正确实现TAP方法?

[英]How to correctly implement a TAP method?

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

// 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博客时,我注意到他们似乎使用较低的方法。 (例如,在本文中

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM