Есть консольное приложение, которое принимает входящие подключения, считывает команду, выполняет ее, и возвращает ответ (или выполняет без ответа). Область деятельности у приложения такая:
1) Http запросы.
2) Запросы к базе данных.
3) Отправка команд по сокетам в другое консольное приложение.
Перерыл много статей в интернете, где написано, что использование ConfigureAwait(false) недопустимо в GUI приложении, т.к. там требуется исходный контекст после выполнения асинхронной функции. У меня консольное приложение, в котором, как я понял, не важно в каком контексте продолжит выполняться функция. Правильно ли я думаю? Может ли повсеместное использование ConfigureAwait(false) в моем приложении обернуться боком? А конкретно:
1) Возможна ли взаимоблокировка (Deadlock).
2) Увеличение нагрузки на систему / уменьшение производительности.
3) Выполнение асинхронных функций не по заданному порядку (вычитал и такое в одной статье).
4) Или какая-нибудь другая проблема, про которую я не знаю.
Пример кода из программы:
private async Task UpdateUserBalance(int id, decimal amount)
{
Transaction transaction = await DataBase.StartTransactionAsync().ConfigureAwait(false);
try
{
UserModel user = await UserModel.FindAsync(id, transaction).ConfigureAwait(false);
user.balance += amount;
await user.Update(transaction).ConfigureAwait(false);
await transaction.CommitAsync().ConfigureAwait(false);
}
catch (Exception e)
{
await transaction.RollbackAsync().ConfigureAwait(false);
}
finally
{
transaction.Dispose();
}
}
Есть так же функции async void, которые вызывают недоверие по отношению к deadlock-ам. Пример:
class TimerClass
{
private Timer _timer; // using System.Timers;
public TimerClass()
{
_timer = new Timer(5 * 1000);
_timer.Elapsed += Callback;
_timer.AutoReset = true;
_timer.Enabled = true;
_timer.Start();
}
private async void Callback(object state, ElapsedEventArgs e)
{
// code
await SomeAsyncFunc().ConfigureAwait(false);
// code
}
}
И еще вопрос. Возможен ли deadlock в этом коде? Т.к используется task.Result.
List<Task> tasks = new List<Task>();
for(int i = 0; i < someLength; i++)
{
tasks.Add(SomeTaskFunc());
}
await Task.WhenAll(tasks);
for(int i = 0; i < tasks.Count; i++)
{
Task task = tasks[i];
// Дальше идут операции с task.Result
}