相关文章推荐
笑点低的毛豆  ·  c# - What is the ...·  2 年前    · 
笑点低的毛豆  ·  Returning null from ...·  2 年前    · 
笑点低的毛豆  ·  asp.net core - Since ...·  2 年前    · 
笑点低的毛豆  ·  Task (JavaFX 8)·  2 年前    · 
笑点低的毛豆  ·  c# - Create a ...·  2 年前    · 
Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

I'm implementing a method Task<Result> StartSomeTask() and happen to know the result already before the method is called. How do I create a Task<T> that has already completed?

This is what I'm currently doing:

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

Is there a better solution?

Note, the answers to this question also work just fine for creating a plain Task (no <T>) because Task<T> inherits from Task. – Tim Lovell-Smith Nov 7, 2012 at 19:56 Note that today there's ValueTask for completed tasks (i.e. for values you already have so that code is essentially synchronous), which will save you an allocation. – nawfal Oct 28, 2018 at 8:28

When targeting .NET 4.5 you can use Task.FromResult:

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

To create a failed task, use Task.FromException:

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

.NET 4.6 adds Task.CompletedTask if you need a non generic Task.

public static Task CompletedTask { get; }
  • When targeting .NET 4.0 with Async Targetting Pack (or AsyncCTP) you can use TaskEx.FromResult instead.

  • To get non-generic Task prior to .NET 4.6, you can use the fact that Task<T> derives from Task and just call Task.FromResult<object>(null) or Task.FromResult(0).

  • To return a non generic task, it's better to use something like Task.FromResult(0). Using "null" as parameter can confuse compiler which cannot determine the generic parameter. – Whyllee Oct 11, 2012 at 8:30 What about exceptions? Async methods are compiled into state machine that catches exceptions and saves them in the returned Task. This happens even for code executing before first await. Method returning Task.FromResult might throw exceptions directly. – Robert Važan Dec 18, 2013 at 18:51 @RobertVažan An interesting edge case. Arguably, if you are retrieving your known result from a method and that method throws exceptions then there is a defect that needs fixing. – Gusdor Jan 30, 2014 at 16:10 @RobertVažan You can easily write your own FromException method, that behaves like FromResult but instead represents a faulted task. Such a method can simply return that for its error cases if it's important for the exception to be represented in the resulting task. – Servy Jan 15, 2015 at 21:25
    private readonly Result theResult = new Result();
    public override Task<Result> StartSomeTask()
        var taskSource = new TaskCompletionSource<Result>();
        taskSource.SetResult(theResult);
        return taskSource.Task;
                    while this will work, it an obscure workaround that might confuse people when reading the code as it implies waiting for tasks that don't exist
    – Adrian Hristov
                    Oct 13, 2019 at 19:01
            

    Thanks for contributing an answer to Stack Overflow!

    • Please be sure to answer the question. Provide details and share your research!

    But avoid

    • Asking for help, clarification, or responding to other answers.
    • Making statements based on opinion; back them up with references or personal experience.

    To learn more, see our tips on writing great answers.