.NET 4.6的Task.CompletedTask有什么意义?

时间:2015-05-27 20:59:33

标签: c# task .net-4.6

This blog post提到了新的Task API,包括.NET 4.6中引入的新Task.CompletedTask属性。

为什么要添加?这比Task.FromResult(whatever)

更好

2 个答案:

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