На данный вопрос уже ответили:
Похоже что получаю Deadlock при использовании ExecuteReaderAsync(). Не могу понять что не так
Task task = ExecReader(tempList, query);
task.Wait();
async Task ExecReader(List<string> tempList, string query)
{
using (SqlConnection sqlConn = new SqlConnection(connStr))
{
try
{
sqlConn.Open();
SqlCommand sqlCmd = new SqlCommand(query, sqlConn);
SqlDataReader reader = await sqlCmd.ExecuteReaderAsync();
while(reader.Read())
{
tempList.Add(reader.GetString(0));
}
catch(Exception e)
{ }
}
}
}
Доходит до ExecuteReaderAsync() и все, виснит наглухо.
Пробовал через GetAwaiter(), но в таком случае главный поток не дожидается выполнения задачи, и берет управление сразу после ExecuteReaderAsync(). А если через GetAwaiter().GetResult(), то снова висит.
Вы сделали две три ошибки, которые вместе приводят к данной проблеме.
Первая из них — вы пользуетесь синхронным Wait. Этот Wait блокирует поток до окончания задачи, а значит, поток будет висеть. Если внутри функции await захочет вернуться в данный поток (судя по всему, вы запустили Task в UI-потоке), он не сможет этого сделать потому, что поток заблокирован — deadlock.
Решение — не пользуйтесь task.Wait();, пользуйтесь await task;.
Вторая ошибка — вы в коде, который не рассчитывает на возвращение в исходный поток, не используете .ConfigureAwait(false). Отсутствие .ConfigureAwait(false) заставляет код хотеть вернуться в UI-поток, если он был в нём запущен.
Пишите
SqlDataReader reader = await sqlCmd.ExecuteReaderAsync().ConfigureAwait(false);
Третья ошибка — вы запускаете Task, работающий с базой данных и содержащий синхронные команды (sqlConn.Open();, например), в непонятно каком, может быть и в UI-потоке. Так делать нельзя, вынесите это всё в фоновый поток.
Итого:
Task task = ExecReader(tempList, query);
await task;
public Task ExecReader(List<string> tempList, string query)
{
async Task Impl()
{
using (SqlConnection sqlConn = new SqlConnection(connStr))
{
try
{
sqlConn.Open();
SqlCommand sqlCmd = new SqlCommand(query, sqlConn);
SqlDataReader reader = await sqlCmd.ExecuteReaderAsync()
.ConfigureAwait(false);
while (reader.Read())
{
tempList.Add(reader.GetString(0));
}
}
catch (Exception e)
{ }
}
}
return Task.Run(Impl);
}
Ещё по теме: Stephen Cleary Don't Block on Async Code.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости