我应该将async / await添加到单行功能吗?

时间:2017-10-17 08:23:56

标签: c# asynchronous async-await

我应该将async / await添加到单行函数中,如:

public async Task<T> GetFoo()
{
    return await HandleAsync<T>(....);
}

如果参数不需要异步调用,这是不必要的开销,我可以简单地写一下:

public Task<T> GetFoo()
{
    return HandleAsync<T>(....);
}

3 个答案:

答案 0 :(得分:6)

使用第二个重载,因为异步方法在后台(一个额外的类)转换为astate机器来处理等待的异步操作。

所以第一种方法会增加不必要的开销。第二次重载只会返回一个你仍然可以等待的任务。

我不确定异常处理如何在这里发生变化,但我认为它并没有改变。

答案 1 :(得分:0)

好吧,这取决于。如果您只是想要返回task,可以在此代码之外等待,那么不,您不需要添加它。但是,您应该等待异步任务,以避免不必要的副作用。这取决于每种情况。

让我们来看看以下案例:

public Task DownloadStream(Stream target)
{
 return _downloader.ToStream(target);
}

会返回一个任务,所以我想下载并处理它,我会等待它,即:

public async Task DownloadAsync()
{
  Using(var stream = new MemoryStream(){
    await DownloadStream(stream); //<== here i NEED to wait and not block the UI
  }
}

希望你可以在你的情况下解释它。

祝你好运!

答案 2 :(得分:0)

我会在你描述的情况下添加async / await。很大程度上,这是一致性的问题 - 我希望任何人都能阅读我的代码,以了解这是一个异步函数,并返回Task<T> - 并且清理风格。

你可能觉得这是你不需要的额外仪式,这很好,这是个人品味的问题。但是,在编译的代码级别,如果有的话,差别很小。当然,如果你真的非常热衷于减少仪式,你可能不会使用C#。