代码之家  ›  专栏  ›  技术社区  ›  dtb

创建已完成的任务<T>

  •  112
  • dtb  · 技术社区  · 15 年前

    我在实施一种方法 Task<Result> StartSomeTask() 碰巧在调用方法之前就知道结果了。如何创建 Task<T> 已经完成了吗?

    这就是我现在正在做的:

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

    有更好的解决办法吗?

    5 回复  |  直到 15 年前
        1
  •  109
  •   QrystaL    15 年前
    private readonly Result theResult = new Result();
    
    public override Task<Result> StartSomeTask()
    {
        var taskSource = new TaskCompletionSource<Result>();
        taskSource.SetResult(theResult);
        return taskSource.Task;
    }
    
        2
  •  197
  •   CodesInChaos    10 年前

    当以.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的解决方法:

    • 当使用异步目标包(或AsyncCTP)以.NET 4.0为目标时,可以使用 TaskEx.FromResult 相反。

    • 获取非泛型 任务 在.NET 4.6之前,您可以使用以下事实 Task<T> 源自 任务 打个电话 Task.FromResult<object>(null) Task.FromResult(0) .

        3
  •  12
  •   Daryl    11 年前

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

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

        4
  •  1
  •   Niall Connaughton    11 年前

    如果您使用的是Rx,另一种方法是observate.Return(result).ToTask()。

        5
  •  0
  •   zumalifeguard Arctic    8 年前

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

    Task task = Task.WhenAll();
    
    推荐文章