对于代表返回 void 的操作的任务,Task.FromResult<T>() 的替代方法是啥?

Posted

技术标签:

【中文标题】对于代表返回 void 的操作的任务,Task.FromResult<T>() 的替代方法是啥?【英文标题】:What is an alternative for Task.FromResult<T>() for tasks that represent operations returning void [duplicate]对于代表返回 void 的操作的任务,Task.FromResult<T>() 的替代方法是什么? 【发布时间】:2015-10-30 17:00:45 【问题描述】:

返回没有泛型类型参数的任务的最佳方法是什么?换句话说,一个代表一个不返回任何东西或返回void的操作的任务?

换句话说,我正在寻找以下替代方案:

T value = default(T);
return Task.FromResult<T>(value); // and

var tcs = new TaskCompletionSource<T>();
tcs.SetResult(value);
return tcs.Task;

但对于代表不应返回任何内容的操作的任务。

【问题讨论】:

【参考方案1】:

Task&lt;T&gt; 扩展 Task - 所以只使用 Task.FromResult&lt;object&gt; 并提供空结果是相当普遍的。例如:

Task ret = Task.FromResult<object>(null);

(或者使用值类型 - 这真的没关系。)

当然,由于任务是不可变的,您可以创建一个 this 的单例实例,并在每次您想要返回 已完成 任务时返回它。 (我相信这实际上是 async/await 基础架构所做的——或者至少在 beta 版本中所做的......)

正如 Asad 所说,您可以使用 Task.CompletedTask,但前提是您的目标是 .NET 4.6。 (实际上,尚不清楚它是否支持 .NET 4.5 - 文档显示“.NET Framework 4.6 和 4.5”作为版本号,但随后显示“支持:4.6”...)

【讨论】:

谢谢。我花了一些时间才将其投票为正确答案,因为我正在考虑其中的含义。虽然签名允许这样做,但我担心如果该任务的使用者期望该任务返回一些东西会发生什么。但你是对的。我正在创作任务,我知道它没有返回任何内容。消费者在无知中期望什么并不重要。他可能会选择等待它或将其扔掉(即开即弃)。无论哪种方式,它都会起作用。 在 4.6 之前,您可以调用不带参数的 Task.WhenAll() 来公开在 4.6 之前是内部的 Task.CompletedTask 截至 2017 年 2 月,Task.CompletedTask 似乎没有出现在便携式设备中。【参考方案2】:

我不确定这是否是严格的惯用语,但我为此使用了Task.CompletedTaskTask.FromResult 是常用的,但在我能想到的所有场景中,CompletedTask 的工作方式相同,并且在语义上更有意义。

【讨论】:

是的 - 这是从 .NET 4.6 开始的最佳方法。 @Asad:是的,我今天早上看到了。它是在 4.6 中添加的,是 FromResult 的语法糖。 @WaterCoolerv2 嗯,它只是一个新属性,并不是真正的语法糖;看着reference source,它似乎没有返回Task.FromResult。尽管如此,它是 4.6 的事实仅使 FromResult 成为正确的选择。 我很抱歉。阅读这篇文章 (blogs.msdn.com/b/pfxteam/archive/2015/02/02/…) 让我相信这是语法糖。你说得对。它不是。感谢您指出了这一点。此外,它的名称代表我想要的东西确实很有意义。只是我不能在我的 VS 2015 Community RC 引用的库中使用它。我希望我们能同时为两个答案投票。

以上是关于对于代表返回 void 的操作的任务,Task.FromResult<T>() 的替代方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

请问 对于指向函数的指针,前面的括号(int (*)(void*,void*))代表啥呢?谢谢

freertos 中用xtaskgettickcount获取的数值代表的时间是1ms吗

C 语言数据类型本质 ( void 关键字作用 | 数据类型封装 | 作为 参数 或 返回值 代表无 | void* 指针赋值与被赋值 | void 类型变量不存在 )

FreeRtos——单任务

javascript:void 含义

FreeRTOS--概述