Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# tasks are executed before Task.WhenAll

Why the tasks are executed before Task.WhenAll??

If you see here, from the below code snippet, first Console.WriteLine("This should be written first.."); should be printed because I am awaiting the tasks beneath to it..

But if you see the output result, the Tasks method result is being printed before the above statement. Ideally, the tasks method should be executed when I await them, but it seems that- the tasks methods are executed the moment I add them in tasks list. Why is it so?

Would you please do let me know why is this happening??

Code:

public static async Task Test()
{
    var tasks = new List<Task>();

    tasks.Add(PrintNumber(1));
    tasks.Add(PrintNumber(2));
    tasks.Add(PrintNumber(3));

    Console.WriteLine("This should be written first..");

    // This should be printed last..
    await Task.WhenAll(tasks);
}

public static async Task PrintNumber(int number)
{
    await Task.FromResult(0);

    Console.WriteLine(number);
}

Output

enter image description here

like image 412
nunu Avatar asked Dec 04 '14 09:12

nunu


1 Answers

When you call an async method you get a "hot" task in return. That means that the task already started running (and maybe even completed) before you get to await them. That means that it's quite possible for the tasks to run and complete before the call to Task.WhenAll.

In your case however, while the PrintNumber is marked async it isn't asynchronous at all since you're using Task.FromResult. The synchronous part of an asynchronous method (which is the part until you await an asynchronous task) is always executed synchronously on the calling thread and is done before the call returns. When you use Task.FromResult you get a completed task so all your method is just the synchronous part and is completed before the call returns.

like image 178
i3arnon Avatar answered Oct 15 '22 07:10

i3arnon