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

Wat*_* v2 6 c# task-parallel-library async-await

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

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

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

var tcs = new TaskCompletionSource<T>();
tcs.SetResult(value);
return tcs.Task;
Run Code Online (Sandbox Code Playgroud)

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

Asa*_*din 12

我不确定这是否是严格惯用的,但我用Task.CompletedTask它.A Task.FromResult是常用的,但在所有场景中,我都可以认为它的CompletedTask工作方式相同,并且在语义上更有意义.

  • 是的 - 这是从.NET 4.6开始的最佳方法. (3认同)

Jon*_*eet 11

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

Task ret = Task.FromResult<object>(null);
Run Code Online (Sandbox Code Playgroud)

(或者使用值类型 - 它确实无关紧要.)

当然,由于任务是不可变的,您可以创建一个单例实例,并在每次要返回已完成的任务时返回它.(我相信这就是async/await基础设施所做的事实 - 或者至少在测试版发布中做过......)

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

  • 在4.6之前,您可以调用没有参数的Task.WhenAll()来公开Task.CompletedTask,它是内部的,直到4.6 (2认同)