这篇博文提到了新的Task API,包括.NET 4.6中引入的一个新的Task.CompletedTask属性.
为什么要添加?比起比这更好的是什么Task.FromResult(whatever)?
Hon*_*tan 41
Task.FromResult(whatever)适用于Task<TResult>,但直到4.6没有任何非通用任务.您可以使用FromResult虚拟值并隐式地将其Task强制转换,但这有点模糊了intent(您实际上并没有返回任何异步值)并在下面分配对象(而CompletedTask可以在所有调用者之间缓存和共享).
在当前(4.5.2及更早版本)的代码库中看到自定义静态完成任务的情况并不少见,因此在我看来将它合并到框架本身是有意义的.
Task.CompletedTask当您需要给调用者一个已经完成的虚拟任务(不返回值/结果)时,属性很重要。这可能是实现“接口”合同或测试目的所必需的。
Task.FromResult(data)还返回一个虚拟任务,但这次带有数据或结果。您可能会这样做,因为您已经拥有数据并且不需要执行任何操作来获取它。
示例使用
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();
}
}
Run Code Online (Sandbox Code Playgroud)