'Best way to use multiple awaits C# .NET Blazor
In a Blazor app I have a file uploader that can take multiple files. When the user clicked 'upload' I used something like this:
private async Task HandleFileUploadClicked()
{
    _isUploading = true;
    StateHasChanged();
    foreach (var file in _files)
    {
        await using var stream = file.OpenReadStream(file.Size);
        await _myService.AddFile(
            stream
        );
    }
    _isUploading = false;
    _files = new List<IBrowserFile>();
    await LoadData();
    StateHasChaged();
}
But I discovered this doesn't work correct. Because I am not using the result of _myService.Addfile the call is just fired and the code continues at _isUploading = false;
Then I thought maybe I should keep an array of the AddFile Tasks and use Task.WaitAll to wait for all of them. But the problem it that this waits on the UI thread, so _isUploading = true; and StateHasChanged have no effect.
My current (working) solution is something like this:
private async Task HandleFileUploadClicked()
{
    _isUploading = true;
    StateHasChanged();
    var allOk = true;
    foreach (var file in _files)
    {
        await using var stream = file.OpenReadStream(file.Size);
        var result = await _myService.AddFile(
            stream
        );
        allOk = result != null && allOk;
    }
    _isUploading = false;
    _files = new List<IBrowserFile>();
    await LoadData();
    StateHasChaged();
}
But this feels like a hack.
Is there a better way to wait for multiple tasks but without blocking the UI thread?
Solution 1:[1]
You can make use of Task Parller Library method Task.WhenAll(). Which will make sure that the tasks are processed in parallel. code snippet should be as follows:
bool allOk = true;
try
{
    var uploadtasks = new List<Task>();
    foreach(var file in filesToUpload)
    {
        uploadtasks.Add(_myService.AddFile(file));
    }
    await Task.WhenAll(uploadtasks);
}
catch(Exception ex)
{
    allOk = false;
}
    					Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source | 
|---|---|
| Solution 1 | 
