等待Task.FromResult有什么好处吗?

时间:2018-08-10 16:40:48

标签: c# c#-4.0 async-await

我已经使用这种形式的代码在基线上工作:

Var result = await Task.FromResult(_someObject.SomeNonAsyncMethod(someParameterObject));

据我对Task.FromResult的了解,这只是将对象包装到结果表单中,而不是将方法包装到任务中以进行异步执行。因此,这些操作会增加额外的开销,而没有任何好处。

这种理解正确吗?

这种使用await进行性能方面有用的事情吗?

是否应该以这种方式使用Task.FromResult? (考虑单独使用此行-不实现接口或在测试中,等等。)

提前感谢您的见解!

2 个答案:

答案 0 :(得分:3)

将两半放在同一行代码中没有用。但是,对于函数来说,将其同步结果打包在Task中以符合接口是很有用的。

在某些情况下,函数甚至可以同时执行同步和异步执行。例如,在快速本地缓存中可能存在同步查找,而在缓存未命中时可能是缓慢的网络操作。这样的函数必须具有Task返回类型,这意味着同步出口需要根据已知结果构造Task。

答案 1 :(得分:0)

有时候您必须实现一个接口,或者重写一个声明为异步的抽象虚拟函数,但是没有异步函数可以调用。

例如,我在一个获取人的接口中有一个方法:

async Task<Person> FetchPersonAsync(int);

如果您要通过一些缓慢的输入(例如从数据库,互联网或文件中)获取此人,那么为此使用异步功能将很有意义。但是,如果您必须从本地字典中读取它(例如在单元测试中进行模拟),那么您就没有任何异步函数可以等待。

如果没有等待您等待的异步函数,但是您必须实现异步函数,请使用FromResult:

async Task<Person> FetchPerson(int id)
{
    return await Task.FromResult<Person>(this.myPersonPictionary[id]);
}

出于性能方面的考虑,只有在您确实需要实现这种功能并且您没有什么可等待的情况下,我才这样做。

相关问题