创build一个完成的任务<T>

我正在实现一个方法Task<Result> StartSomeTask()并且恰好在调用方法之前知道结果。 如何创build已完成的任务<T> ?

这是我目前正在做的事情:

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

有更好的解决scheme吗?

 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); 

要创build失败的任务,请使用Task.FromException

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

如果您需要非通用Task .NET 4.6将添加Task.CompletedTask

 public static Task CompletedTask { get; } 

旧版.NET的解决方法:

  • 当使用Async Targetting Pack(或AsyncCTP)将.NET 4.0作为目标时,您可以改为使用TaskEx.FromResult

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

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

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

如果您使用的是Rx,则可以使用Observable.Return(result).ToTask()。