Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET4.6';s Task.CompletedTask?_C#_Task_.net 4.6 - Fatal编程技术网

C# .NET4.6';s Task.CompletedTask?

C# .NET4.6';s Task.CompletedTask?,c#,task,.net-4.6,C#,Task,.net 4.6,提到了新的任务API,包括.NET4.6中引入的新属性 为什么要加上这个?比如说,这比任务好多少呢?FromResult(无论什么)?任务。FromResult(无论什么)适用于任务,但在4.6之前,非通用任务没有任何功能。您可以使用带有伪值的FromResult,并隐式地将其强制转换为Task,但这在一定程度上混淆了意图(您并没有真正返回任何异步值)并在其下分配对象(而CompletedTask可以在所有调用方之间缓存和共享) 在当前(4.5.2及更早版本)的代码库中看到定制的静态已完成任务并

提到了新的任务API,包括.NET4.6中引入的新属性

为什么要加上这个?比如说,这比任务好多少呢?FromResult(无论什么)?

任务。FromResult(无论什么)
适用于任务,但在4.6之前,非通用任务没有任何功能。您可以使用带有伪值的
FromResult
,并隐式地将其强制转换为
Task
,但这在一定程度上混淆了意图(您并没有真正返回任何异步值)并在其下分配对象(而
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();
    }
}
公共任务DoSomethingAsync()
{
return Task.CompletedTask;//null将在等待时引发异常
}
公共任务GetUserAsync()
{
if(cachedUser!=null)
{
返回Task.FromResult(cachedUser);
}
其他的
{
返回GetUserFromDb();
}
}

还不够清楚吗?原因是您可以通过创建处于固定状态的静态不可变任务来节省内存。如果您需要返回已完成的任务,例如,您只能选择从网络下载内容,否则返回设置为已完成的虚拟任务,以便等待您的任务的调用方可以立即继续。到目前为止,您需要创建自己的实例并缓存它,或者通过TaskCompletionSource再次创建它。博客文章已经解释了添加
Task.CompletedTask
的原因。。。它特别提到“关心性能和避免分配的库代码”。现在将其与您的
任务进行比较。FromResult(无论什么)
:这会避免分配吗?不,没有。