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]);
}
出于性能原因,我只会在您确实需要实现这样的功能时才这样做,而且您没有什么可等待的。
我使用这种形式的代码在基线上工作:
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]);
}
出于性能原因,我只会在您确实需要实现这样的功能时才这样做,而且您没有什么可等待的。