Task.FromResult
和Task.CompletedTask
有什么区别?
public Task Test1()
{
return Task.CompletedTask;
}
public Task Test2()
{
return Task.FromResult(0);
}
您的
Task.FromResult(0)
确实返回了 Task<int>
,而不是(只是)普通的 Task
。
所以这会编译得很好
public Task<int> Test2()
{
return Task.FromResult(0);
}
您不能在此处使用 Task.CompletedTask。
后期编辑
另一个区别是
Task.CompletedTask
是一个缓存值(读:不需要新的分配),而 Task.FromResult(..)
may 需要创建一个新的 Task 实例(尽管它会在可能的情况下尝试返回一个缓存实例,例如 default
值)。
CompletedTask
没有结果字段,也没有泛型类型参数。您可以使用它来跳过占用系统资源来完成工作。
FromResult
变体返回泛型 Task
,参数的类型是泛型类型参数。在调用者期望异步行为并因此请求 Task
返回的上下文中,您可以使用此变体来避免浪费资源仅返回值。
请注意,泛型
Task<T>
派生自非泛型 Task
,因此这两种方法在调用者进行即发即忘调用或只是不关心读取结果的上下文中同样有效。