C# 创建已完成的任务<;T>;
我正在实现一个方法C# 创建已完成的任务<;T>;,c#,.net,task-parallel-library,C#,.net,Task Parallel Library,我正在实现一个方法Task StartSomeTask(),并且碰巧在调用该方法之前就知道了结果。如何创建已完成的项目 这就是我目前正在做的: private readonly Result theResult = new Result(); public override Task<Result> StartSomeTask() { var task = new Task<Result>(() => theResult); task.RunSyn
Task StartSomeTask()
,并且碰巧在调用该方法之前就知道了结果。如何创建已完成的项目
这就是我目前正在做的:
private readonly Result theResult = new Result();
public override Task<Result> StartSomeTask()
{
var task = new Task<Result>(() => theResult);
task.RunSynchronously(CurrentThreadTaskScheduler.CurrentThread);
return task;
}
private readonly Result theResult=new Result();
公共覆盖任务StartSometTask()
{
var任务=新任务(()=>结果);
同步运行(CurrentThreadTaskScheduler.CurrentThread);
返回任务;
}
有更好的解决方案吗?private readonly Result theResult=new Result();
private readonly Result theResult = new Result();
public override Task<Result> StartSomeTask()
{
var taskSource = new TaskCompletionSource<Result>();
taskSource.SetResult(theResult);
return taskSource.Task;
}
公共覆盖任务StartSometTask()
{
var taskSource=new TaskCompletionSource();
taskSource.SetResult(结果);
返回taskSource.Task;
}
以.NET 4.5为目标时,您可以使用:
如果需要非通用的任务
,则.NET 4.6会添加
public static Task CompletedTask { get; }
较旧版本的.NET的变通方法:
- 当使用异步目标包(或AsyncCTP)以.NET 4.0为目标时,您可以使用
TaskEx.FromResult
- 要获得.NET 4.6之前的非通用
,可以使用任务
派生自任务
的事实,只需调用任务
或任务.FromResult(null)
任务.FromResult(0)
它返回已处于TaskStatus.RanToCompletion状态的任务。它可能每次都返回同一个实例,但文档警告您不要依赖于这一事实。调用Task.whall不带任何参数将返回已完成的任务
Task task = Task.WhenAll();
要返回非泛型任务,最好使用类似task.FromResult(0)的内容。使用“null”作为参数可能会使无法确定泛型参数的编译器感到困惑。异常情况如何?异步方法被编译成状态机,状态机捕获异常并将它们保存在返回的任务中。即使是在首次等待之前执行的代码也会发生这种情况。返回Task.FromResult的方法可能会直接抛出异常。@RobertVaž是一个有趣的边缘案例。可以说,如果您正在从一个方法检索已知结果,而该方法抛出异常,则存在一个需要修复的缺陷。@RobertVažan您可以轻松地编写自己的
FromException
方法,该方法的行为类似于FromResult
,但表示一个错误的任务。如果异常在生成的task中表示很重要,那么这种方法可以简单地返回它的错误情况。task.FromException在.NET 4.5中不可用。。。我认为应该指定它。请注意,这个问题的答案对于创建普通任务(否)也很有效,因为任务继承自任务。请注意,今天对于已完成的任务有ValueTask
(即,对于您已经拥有的值,代码基本上是同步的),这将为你节省一笔拨款。@DanielLobo如果你解释一下你的反对意见,你可能会得到一个答案,不是下面的那一个更简单,而且有更多的赞成票吗@user2023861虽然这会起作用,但它是一个模糊的解决方法,可能会让人们在阅读代码时感到困惑,因为它意味着等待不存在的任务
public static Task CompletedTask { get; }
Task task = Task.WhenAll();