9 / 9 / 0
Регистрация: 27.01.2013
Сообщений: 248
|
|||||||||||
1 | |||||||||||
Асинхронное программирование await async23.03.2015, 21:34. Показов 2498. Ответов 9
Метки нет (Все метки)
Всем привет!
Пытаюсь разобраться с асинхронным вызовом методов. Узнал такую вещь: если предполагается, что некоторый метод может долго выполнятся, то его можно перенести в "фоновое" выполнение, а управление отдать в вызывающий метод. Решил разобраться с этим и написал для начала обычный код без асинхронного программирования.
В этом коде я ожидал такое поведение: 1. Файл начинает скачиваться. 2. Так как закачка переходит в фоновый режим, то управление возвращается методу Download(), и следовательно выводится на консоль Welcome to Hell. 3. По окончании загрузки файла выводится результат Length. Однако всего этого не происходит, а вместо этого просто запускается консоль без единого сообщения, кроме того, чтобы я нажал эникей. Почему так происходит, или где я ошибся в коде? Спасибо.
0
|
23.03.2015, 21:34 | |
Ответы с готовыми решениями:
9
Async, await Использование async/await Непонятная работа async await Пауза через async/await |
23.03.2015, 21:58 | 2 | |||||
bazyzy, Ну вы же сами примяете оператор await. А этот оператор останаваливает поток до получения резульатата из Task, который возвращается из метода DownloadDataTaskAsync.
Если вы хотите что бы работало так как вы ожидаете, код должен быть таким:
1
|
9 / 9 / 0
Регистрация: 27.01.2013
Сообщений: 248
|
|
24.03.2015, 02:42 [ТС] | 3 |
Но если я правильно понимаю, то он приостанавливает поток ради метода DownloadDataTaskAsync, а когда этот метод вернет результат, тогда поток возобновляется. Но у меня же выходит, что как только доходит дело до строки где вызывается этот метод, то программа дальше даже и не идет по строкам кода, а завершается как выполненная. Вы дали код, но он тоже не работает ожидаемо, он просто выводит Welcome to Hell и программа завершается без загрузки файла и вызова Lenght для массива
0
|
Warrior
500 / 427 / 177
Регистрация: 23.11.2014
Сообщений: 932
|
|
24.03.2015, 03:38 | 4 |
https://msdn.microsoft.com/ru-... 56528.aspx
Оператор await применяется к задаче в асинхронных методах, для того, чтобы приостановить выполнение метода до тех пор, пока ожидаемая задача не завершится
1
|
24.03.2015, 08:16 | 5 | |||||
bazyzy,
1
|
24.03.2015, 09:55 | 6 | ||||||||||
Сообщение было отмечено bazyzy как решение
Решение
А это потому, что ваш метод Download объявлен как async.
Когда внутри метода async вы вызываете await, управление передеается во внешний метод (т.е. в Main). А поскольку в Main у вас больше кода нет, то программа завершается. Вот так все работает:
1
|
9 / 9 / 0
Регистрация: 27.01.2013
Сообщений: 248
|
|
24.03.2015, 12:23 [ТС] | 7 |
Аааа, вот оно что. Это проясняет ситуацию. Я думал, что этот внешний метод - DownloadDataTaskAsync, а не маин. И следовательно я предполагал, что когда DownloadDataTaskAsync выполнится, то код продолжит свое выполнение.
0
|
24.03.2015, 12:51 | 8 | |||||
Можешь ещё так ждать, но смысла в этом ноль, как мне кажется:
bazyzy, вот посмотри и не заморачивайся подобными вопросами
1
|
9 / 9 / 0
Регистрация: 27.01.2013
Сообщений: 248
|
|
24.03.2015, 13:14 [ТС] | 9 |
О, спасибо огромное за информацию и видеоурок !! Меня сбила с толку книга по ASP.NET MVC. Сейчас скриншот приложу
0
|
Master of Orion
|
|
24.03.2015, 13:43 | 10 |
bazyzy, там всё правильно написано, просто вы не так поняли...
1
|
24.03.2015, 13:43 | |
24.03.2015, 13:43 | |
Помогаю со студенческими работами здесь
10
Понимание потоков и async await Async/await различия методов Sockets client+server with await/async c# 5.0 async/await как замена многопоточности Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |