首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >创建已完成的任务

创建已完成的任务
EN

Stack Overflow用户
提问于 2013-01-10 02:36:49
回答 6查看 99.6K关注 0票数 216

我想创建一个完整的Task (不是Task<T>)。.NET中有没有内置的东西可以做到这一点?

一个相关的问题:Create a completed Task

EN

回答 6

Stack Overflow用户

发布于 2013-01-10 02:44:07

Task<T>可以隐式转换为Task,因此只需获取一个完整的Task<T> (具有任何T和任何值)并使用它即可。您可以使用类似这样的东西来隐藏实际结果在某处的事实。

代码语言:javascript
复制
private static Task completedTask = Task.FromResult(false);
public static Task CompletedTask()
{
    return completedTask;
}

请注意,因为我们没有公开结果,并且任务总是完成的,所以我们可以缓存单个任务并重用它。

如果您使用的是.NET 4.0,但没有FromResult,那么您可以使用TaskCompletionSource创建自己的and

代码语言:javascript
复制
public static Task<T> FromResult<T>(T value)
{
    var tcs = new TaskCompletionSource<T>();
    tcs.SetResult(value);
    return tcs.Task;
}
票数 168
EN

Stack Overflow用户

发布于 2014-11-04 22:32:18

我更喜欢的方法是不带参数地调用Task.WhenAll()MSDN documentation声明“如果提供的数组/枚举不包含任何任务,则返回的任务将在返回给调用者之前立即转换为RanToCompletion状态”。这听起来就是你想要的。

更新:我在Microsoft's Reference Source上找到了源代码;在那里你可以看到Task.WhenAll包含以下内容:

代码语言:javascript
复制
return (tasks.Length == 0) ? // take shortcut if there are no tasks upon which to wait
            Task.CompletedTask :
            new WhenAllPromise(tasks);

所以Task.CompletedTask确实是内部的,但是通过不带参数地调用WhenAll()来公开它。

票数 69
EN

Stack Overflow用户

发布于 2013-01-10 02:42:07

您可以使用Task.FromResult (在.NET 4.5中)返回一个完整的Task<T>

如果需要非泛型Task,可以始终使用Task.FromResult(0)或类似的方法,因为Task<T>Task的子类。

票数 34
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14244114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档