.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();
    }
}