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工作方式相同,并且在语义上更有意义.
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"......)