创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()。