我想创建一个完整的Task
(不是Task<T>
)。.NET中有没有内置的东西可以做到这一点?
一个相关的问题:Create a completed Task
发布于 2013-01-10 02:44:07
Task<T>
可以隐式转换为Task
,因此只需获取一个完整的Task<T>
(具有任何T
和任何值)并使用它即可。您可以使用类似这样的东西来隐藏实际结果在某处的事实。
private static Task completedTask = Task.FromResult(false);
public static Task CompletedTask()
{
return completedTask;
}
请注意,因为我们没有公开结果,并且任务总是完成的,所以我们可以缓存单个任务并重用它。
如果您使用的是.NET 4.0,但没有FromResult
,那么您可以使用TaskCompletionSource
创建自己的and
public static Task<T> FromResult<T>(T value)
{
var tcs = new TaskCompletionSource<T>();
tcs.SetResult(value);
return tcs.Task;
}
发布于 2014-11-04 22:32:18
我更喜欢的方法是不带参数地调用Task.WhenAll()
。MSDN documentation声明“如果提供的数组/枚举不包含任何任务,则返回的任务将在返回给调用者之前立即转换为RanToCompletion状态”。这听起来就是你想要的。
更新:我在Microsoft's Reference Source上找到了源代码;在那里你可以看到Task.WhenAll包含以下内容:
return (tasks.Length == 0) ? // take shortcut if there are no tasks upon which to wait
Task.CompletedTask :
new WhenAllPromise(tasks);
所以Task.CompletedTask确实是内部的,但是通过不带参数地调用WhenAll()来公开它。
发布于 2013-01-10 02:42:07
您可以使用Task.FromResult (在.NET 4.5中)返回一个完整的Task<T>
。
如果需要非泛型Task
,可以始终使用Task.FromResult(0)
或类似的方法,因为Task<T>
是Task
的子类。
https://stackoverflow.com/questions/14244114
复制相似问题