42

I have a list of tasks, which i'd like to wait for. I'm waiting like

    await TaskEx.WhenAll(MyViewModel.GetListOfTasks().ToArray());

MyViewModel.GetListOfTasks() returns List of Task:

    var tasksList = new List<Task>();
    foreach (var item in Items)
    {                
        tasksList.Add(item.MyTask());
    }

Now, i'd like to return dummy task, which would be done immediately. However, TaskEx.WhenAll would wait it forever:

    public Task<bool> MyTask()
    {
        return new Task<bool>(() => false);
    }

How can i return Task, which would be finished instantly?

Vitalii Vasylenko
  • 4,116
  • 4
  • 34
  • 57

2 Answers2

89

in .NET 4.5 you can use FromResult to immediately return a result for your task.

public Task<bool> MyTask()
{
    return TaskEx.FromResult(false);
}

http://msdn.microsoft.com/en-us/library/hh228607%28v=vs.110%29.aspx


For Windows Phone 8.1 and higher, the API has been merged to be consistent with other platforms:

public Task<bool> MyTask()
{
    return Task.FromResult(false);
}
David L
  • 28,075
  • 7
  • 54
  • 84
  • 4
    Since the final release of the Framework its: return Task.FromResult(false); – uli78 Feb 10 '17 at 06:20
  • 1
    @uli78 this question was specifically for windows phone 7, but great point! I've updated my answer, thank you! – David L Feb 10 '17 at 06:50
9

Prior to .NET 4.5, you can use TaskCompletionSource<TResult> to simulate the FromResult method.

public static Task<TResult> FromResult<TResult>(TResult result)
{
    var completionSource = new TaskCompletionSource<TResult>();
    completionSource.SetResult(result);
    return completionSource.Task;
}
Sam Harwell
  • 92,171
  • 18
  • 189
  • 263