1 | |||||||||||
Почему Task никогда не завершается?07.04.2019, 11:59. Показов 2111. Ответов 6
Добрый день!
Пробую свои силы в async/await. Подскажите, почему в данном коде никогда не происходит события task.IsCompleted ? На выходе просто вижу изменение таймера и сообщение "Wait for .... milliseconds".
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
|
|
07.04.2019, 11:59 | |
Ответы с готовыми решениями:
6
Морской бой: Проверка на победителя никогда не завершается
Почему в РСФСР-СССР никогда не было скоростного транспортного транзита – трансферта? |
![]() 16746 / 12497 / 3285
Регистрация: 17.09.2011
Сообщений: 20,729
|
|
07.04.2019, 15:23 | 2 |
skitale, какое значение передаваемого value в метод StartAsyncMethod?
0
|
08.04.2019, 00:48 [ТС] | 3 |
натуральное число - 1, 2 и т.д. - ввожу сам
Может дело в вызове Thread.Sleep(1000) на 9-й строке - не вызывает ли он дедлок? Добавлено через 45 минут Нет, дело не в Thread.Sleep(1000) - заменил на for (int i = 0; i < 1000000; i++){} и ситуация не изменилась.
0
|
![]() 16746 / 12497 / 3285
Регистрация: 17.09.2011
Сообщений: 20,729
|
|
08.04.2019, 00:50 | 4 |
0
|
08.04.2019, 01:26 [ТС] | 5 |
Создал отдельное консольное приложение (изначально код писался для AspNet-приложения), вставил приведенный выше код и вот результаты:
С циклом while(!task.IsCompleted) : Без цикла while : Ничего не понимаю.... В консольном приложении код работает корректно, а в AspNet - получается, нет... Почему?
0
|
15.04.2019, 11:05 [ТС] | 6 | ||||||||||
![]() Решение
Может быть кому-то будет полезно:
При запуске в ASPNet программа уходила в deadlock из-за того, что в вызывающем методе крутился цикл, ожидавший завершения Task'а в AsyncMethod :
await в том же потоке (это настройка по-умолчанию для асинхронного метода - он всегда будет пытаться выполнить код после await в том же контексте, в котором начал выполнеие async-метода). Плюс к тому текущий контекст - однопоточный - это особенность контекстов для ASPNet, WPF, WInForms - везде где есть UI. Получалось, что данный поток был занят ожиданием завершения таска, которому он же был нужен для завершения - классический дедлок.В консольном приложении этой проблемы не возникло потому что оно при запуске не создает контекста синхронизации, а в таком случае async-метод автоматически создаст свой контекст и без проблем выполнит в нем код после await .Одно из решений проблемы: Разрешить компилятору выполнять код после async в любом другом потоке - добавить настройку ConfigureAwait(false) :
Мне сделали замечание, что использовать в условии task.IsCompleted не есть хорошо.Также рекомендуется использовать вместо Thread.Sleep() метод Task.Delay() ;Полезные ссылки по теме: Мой вопрос с подробным ответом на StackOwerflow. Андрей Часовских — Async/await: собираем грабли Видео курс C# Professional. Урок 15. Async Await На русском стековерфлоу можно посикать по запросу "Почему async/await блокирует UI? [дубликат]" Хорошая статья про контексты синхронизации на русском. Она же на английском. Основная книга по асинхронному программированию от Стивена Клири (есть только на английском): "Concurrency in C# Cookbook" Неплохое объяснение на хабре разницы между многопоточностью и асинхронностью (перевод ужасен, но все же):на русском на английском
0
|
15.04.2019, 17:26 [ТС] | 7 |
Пардон, ошибочное сообщение
0
|
15.04.2019, 17:26 | |
Помогаю со студенческими работами здесь
7
Почему в физике так много разговоров об ускорении, и почти никогда не говорится о замедлении Почему приложение не завершается? Почему программа некорректно завершается? Прерывание SIGINT. Почему не завершается программа? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |