This blog post提到了新的Task API,包括.NET 4.6中引入的新Task.CompletedTask属性。
为什么要添加?这比Task.FromResult(whatever)
?
答案 0 :(得分:38)
Task.FromResult(whatever)
适用于Task<TResult>
,但在4.6之前,非通用任务没有任何内容。您可以将FromResult
与虚拟值一起使用并隐式地将其强制转换为Task
,但这有点模糊了意图(您并未真正返回任何异步值)和分配下面的对象(而CompletedTask
可以在所有调用者之间缓存和共享)。
在当前(4.5.2及更早版本)的代码库中看到自定义静态完成任务的情况并不少见,因此在我看来将它合并到框架本身是有意义的。
答案 1 :(得分:3)
Task.CompletedTask
属性非常重要,当您需要给调用者一个已经完成的虚拟Task(不返回值/结果)时。
这可能是实现“接口”合同或测试目的所必需的。
Task.FromResult(data)
还返回一个虚拟Task,但这一次包含数据或结果。您可能会这样做,因为您已经有了数据并且
无需执行任何操作即可获取它。
示例用法
public Task DoSomethingAsync()
{
return Task.CompletedTask; // null would throw exception on await
}
public Task<User> GetUserAsync()
{
if(cachedUser != null)
{
return Task.FromResult(cachedUser);
}
else
{
return GetUserFromDb();
}
}