C# .NET4.6';s Task.CompletedTask?
提到了新的任务API,包括.NET4.6中引入的新属性 为什么要加上这个?比如说,这比任务好多少呢?FromResult(无论什么)?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及更早版本)的代码库中看到定制的静态已完成任务并
任务。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(无论什么)
:这会避免分配吗?不,没有。