For async newcomers, be careful with Task.Result

Accessing the property’s get accessor blocks the calling thread until the asynchronous operation is complete; it is equivalent to calling the Wait method.

From: https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.task-1.result?view=net-5.0

The slow one.

private async Task<int> GetIt()
{
    await Task.Delay(2000);
    var myInt = new Random().Next(0, 5);
    return myInt;
}

var tasks = new List<Task<int>>();
for (var i = 0; i < 3; i++)
{
    var task=GetIt();
    tasks.Add(task);
    Console.WriteLine(task.Result);
}

await Task.WhenAll(tasks);

The fast one

private async Task<int> GetIt()
{
    await Task.Delay(2000);
    var myInt = new Random().Next(0, 5);
    return myInt;
}

var tasks = new List<Task<int>>();
for (var i = 0; i < 3; i++)
{
    var task=GetIt();
    tasks.Add(task);
}

await Task.WhenAll(tasks);
foreach(var t in tasks)
{
    Console.WriteLine(t.Result);
}

Leave a comment