我已经使用这种形式的代码在基线上工作:
Var result = await Task.FromResult(_someObject.SomeNonAsyncMethod(someParameterObject));
据我对Task.FromResult的了解,这只是将对象包装到结果表单中,而不是将方法包装到任务中以进行异步执行。因此,这些操作会增加额外的开销,而没有任何好处。
这种理解正确吗?
这种使用await进行性能方面有用的事情吗?
是否应该以这种方式使用Task.FromResult? (考虑单独使用此行-不实现接口或在测试中,等等。)
提前感谢您的见解!
答案 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]);
}
出于性能方面的考虑,只有在您确实需要实现这种功能并且您没有什么可等待的情况下,我才这样做。