I am trying to get my head around ConfigureAwait(false) and came across this https://devblogs.microsoft.com/dotnet/configureawait-faq/ From what I understand, and please correct me if I am wrong, is that ConfigureAwait(false) should be used when we are NOT sure of the calling SynchronizationContext's queuing capacity for tasks, or a potential for a deadlock.
We have asp dotnetcore project where we expose few endpoints for CRUD operations on certain functionality. In the database layer of this project, I came across code like:
public async Task<SomeType> CreateItemAsync(Item item, DateTime startDate, DateTime endDate) { await using var connection = SqlConnection.GetConnectionAsync(); try { var item = await connecion.QueryAsync<int>(....).ConfigureAwait(false); if(item == null) { throw new DatabaseException($"failed to insert item"); } var subItemsTasks = new List<Task<int>>(); subItemsTasks.Add(connection.QueryAsync(...)); //subItem1 subItemsTasks.Add(connection.QueryAsync(...)); //subItem2 subItemsTasks.Add(connection.QueryAsync(...)); //subItem3 ... ... await Task.WhenAll(subItemsTasks).ConfigureAwait(false); return await connection.QueryAsync<int>(...).ConfigureAwait(false); } catch (Exception e) { throw new DatabaseException(...); } } Is this a good pattern to implement? Also, do we need ConfigureAwait(false) on Task.WhenAll() when it is already called on a different synchronization context than original. Same for the return statement configure await.
asynchas a "fast path" which means you can't know it's on a thread pool context. Either useConfigureAwait(false)for everyawaitin a method, or none of them. Note that if you know this will only be used on ASP.NET Core, then you don't needConfigureAwait(false).