创建一个已完成的任务 < T >

我正在实现一个方法 Task<Result> StartSomeTask(),碰巧在调用该方法之前就已经知道结果了。如何创建一个已经完成的 任务 < T >

这就是我目前正在做的:

private readonly Result theResult = new Result();


public override Task<Result> StartSomeTask()
{
var task = new Task<Result>(() => theResult);
task.RunSynchronously(CurrentThreadTaskScheduler.CurrentThread);
return task;
}

还有更好的解决办法吗?

51463 次浏览
private readonly Result theResult = new Result();


public override Task<Result> StartSomeTask()
{
var taskSource = new TaskCompletionSource<Result>();
taskSource.SetResult(theResult);
return taskSource.Task;
}

当瞄准.NET 4.5时,你可以使用 Task.FromResult:

public static Task<TResult> FromResult<TResult>(TResult result);

若要创建失败的任务,请使用 Task.FromException:

public static Task FromException(Exception exception);
public static Task<TResult> FromException<TResult>(Exception exception);

NET 4.6添加了 Task.CompletedTask,如果你需要一个非通用的 Task

public static Task CompletedTask { get; }

针对.NET 旧版本的解决方案:

  • 当使用 AsyncTargetPack (或 AsyncCTP)定位.NET 4.0时,可以改用 TaskEx.FromResult

  • 获得非通用 Task之前。NET 4.6,可以使用 Task<T>Task派生的事实,只需调用 Task.FromResult<object>(null)Task.FromResult(0)

如果您正在使用 Rx,一个替代方案是 Obable.Return (result) . ToTask ()。

对于没有返回值的任务,.NET 4.6添加了 任务。完成任务

它返回一个已经处于 TaskStatus.RanToCompletion状态的任务。它可能每次都返回相同的实例,但是文档警告您不要指望这个事实。

不带任何参数的调用 Task.WhenAll 将返回一个已完成的任务。

Task task = Task.WhenAll();

你可以试试 var myAlreadyCompletedTask = Task.FromResult<string>("MyValue") 这将为您提供具有指定返回类型的任务