.NET 4.6 Task.CompletedTask 的意义何在?
What is the point of .NET 4.6's Task.CompletedTask?
This blog post mentions the new Task APIs, including a new Task.CompletedTask 属性 在 .NET 4.6 中引入。
为什么添加这个?这比 Task.FromResult(whatever)
更好吗?
Task.FromResult(whatever)
适用于 Task<TResult>
,但在 4.6 之前,非通用任务没有任何内容。您可以将 FromResult
与虚拟值一起使用并将其隐式转换为 Task
,但这有点混淆了意图(您实际上并没有返回任何异步 值 )并在下面分配对象(而 CompletedTask
可以缓存并在所有调用者之间共享)。
在当前(4.5.2 及更早版本)代码库中看到自定义静态完成的任务并不少见,因此我认为将其合并到框架本身是有意义的。
Task.CompletedTask
属性 当您需要给调用者一个已经完成的虚拟任务(不是 return 和 value/result)时很重要。
这可能是履行“接口”合同或测试目的所必需的。
Task.FromResult(data)
也 return 是一个虚拟任务,但这次有数据或结果。您可能会这样做,因为您已经拥有数据并且
无需任何操作即可获取。
示例 - Task.CompletedTask
public Task DoSomethingAsync()
{
return Task.CompletedTask; // null would throw exception on await
}
示例 - Task.FromResult(数据)
public Task<User> GetUserAsync()
{
if(cachedUser != null)
{
return Task.FromResult(cachedUser);
}
else
{
return GetUserFromDb();
}
}
This blog post mentions the new Task APIs, including a new Task.CompletedTask 属性 在 .NET 4.6 中引入。
为什么添加这个?这比 Task.FromResult(whatever)
更好吗?
Task.FromResult(whatever)
适用于 Task<TResult>
,但在 4.6 之前,非通用任务没有任何内容。您可以将 FromResult
与虚拟值一起使用并将其隐式转换为 Task
,但这有点混淆了意图(您实际上并没有返回任何异步 值 )并在下面分配对象(而 CompletedTask
可以缓存并在所有调用者之间共享)。
在当前(4.5.2 及更早版本)代码库中看到自定义静态完成的任务并不少见,因此我认为将其合并到框架本身是有意义的。
Task.CompletedTask
属性 当您需要给调用者一个已经完成的虚拟任务(不是 return 和 value/result)时很重要。
这可能是履行“接口”合同或测试目的所必需的。
Task.FromResult(data)
也 return 是一个虚拟任务,但这次有数据或结果。您可能会这样做,因为您已经拥有数据并且
无需任何操作即可获取。
示例 - Task.CompletedTask
public Task DoSomethingAsync()
{
return Task.CompletedTask; // null would throw exception on await
}
示例 - Task.FromResult(数据)
public Task<User> GetUserAsync()
{
if(cachedUser != null)
{
return Task.FromResult(cachedUser);
}
else
{
return GetUserFromDb();
}
}