Объясните пожалуйста, почему плохо вызывать синхронные методы в асинхронной обертке (C#)
Часто всплывает тема "истинной" асинхронности. Также часто слышу, что заворачивать синхронный метод в асинхронную обертку - это плохо. Пусть у меня есть такой вот код:
class Program
{
static string GetResult(int id)
{
// Очень долги, идущий в базу, синхронный, блокирующий метод
...
}
static async Task Main(string[] args)
{
var res = await Task.Run(() => GetResult(123));
}
}
Чем это плохо, я имею в виду, завернуть блокирующий метод в await Task.Run(...)?
Можете простыми словами расписать суть проблемы? Был бы очень благодарен.
Ответы (1 шт):
При данном подходе будет простаивать один поток в ожидании ответа от базы данных. Не сказать что это решение ужасающе плохое, но есть ряд сценариев, когда желательно бы этот поток занять какой-то другой работой.
Например: высоконагруженный сервис плохо обслуживает клиентов из-за дефицита свободных потоков в пуле.
Более правильное решение это переписать GetResult таким образом, чтобы все операции с базой данных происходили через асинхронное API. В таком случае, поток просто отправляет запрос в базу данных, и освобождается. Ответ от БД будет обработан в любом свободном потоке.
UPD: Очень рекомендую почитать блоги этого парня: Stephen Cleary - Async and Await. Многие веши проясняют. Конкретные ссылки по теме: