await Task.FromResult 有什么好处吗?

Does await Task.FromResult give any benefit?

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

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

据我了解Task.FromResult,这只是简单地将一个对象包装成结果形式,而不是将方法包装成异步执行的任务。因此,这些操作增加了额外的开销而没有任何好处。

这个理解对吗?

这种 await 的使用对性能有什么帮助吗?

应该以这种方式使用 await Task.FromResult 吗? (考虑到这一行单独使用 - 没有实现接口或在测试中等。)

提前感谢您的任何见解!

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

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

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

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

async Task<Person> FetchPersonAsync(int);

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

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

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

出于性能原因,我只会在您确实需要实现这样的功能时才这样做,而且您没有什么可等待的。