|
await,async и TASK - не получается.
|
|||
---|---|---|---|
#18+
Понимаю, что позорно,заблудился в трех словах, но ведь и на самом деле не выходит. Есть метод Код: c# 1. 2. 3. 4.
Есть модный класс (какой-нибудь из httpClient или WebClient c Extensions), который имеет метод DownloadStringTaskAsync<String>() (кажется так) Вопрос - как из метода, обозначенного выше вернуть строку, которую асинхронно возвращает ВебКлиент в виде задачи? Я рыл инет - ловлю deadlock-и при любых раскладах. Пробовал и configureAwaits(false) и Wait() и пытался распространять асинхронность по всему коду (этот момент кстати не до конца понял). В примерах часто приводится код с использованием CTP - так он вообще не компилируется (await-ы в методах без async-ов) В идеале хочется, не морозя UI получить ответ и дальше с ним работать. С помощью TPL я так понял это можно сделать. Но я не понимаю как. Про распространение асинхронности - но ведь все равно когда-то придется получить результат. А результат у меня получить ни разу не удалось. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2013, 02:13 |
|
await,async и TASK - не получается.
|
|||
---|---|---|---|
#18+
Monochromatique, что бы не заморачиваться , если есть доступ к серверу , то можно использовать WCF. а метод someStringFromServer сделать асинхроным, в конце которого запустить событие окончания приёма. на всё провсё 15-20 минут. WCF по шагам годно описан в msdn. даже новичёк поймёт. по шагам или тут тынц2 ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2013, 02:29 |
|
await,async и TASK - не получается.
|
|||
---|---|---|---|
#18+
Monochromatique, вот как-то примерно так: ваш UI Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34.
метод MyClient Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26.
таким образом нажатие на кнопку не приводит к блокировке UI, асинхронно приложение ломится куда-то там и что-то делает через HttpClient (полностью асинхронный клиент). работу можно отменить через CancellationTokenSource. ну и поменьше заморочек с контекcтом. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2013, 04:21 |
|
await,async и TASK - не получается.
|
|||
---|---|---|---|
#18+
beg-in-erMonochromatique, что бы не заморачиваться , если есть доступ к серверу , то можно использовать WCF. а метод someStringFromServer сделать асинхроным, в конце которого запустить событие окончания приёма. на всё провсё 15-20 минут. WCF по шагам годно описан в msdn. даже новичёк поймёт. по шагам или тут тынц2 Нееее, доступа к веб-серверу нету. Наглухо. Да и потом, webClient сам по себе имеет Async метод с событием по окончании. Так что WCF тут без нужды, но на совет спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2013, 07:36 |
|
await,async и TASK - не получается.
|
|||
---|---|---|---|
#18+
hVosttMonochromatique, вот как-то примерно так: ваш UI Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34.
метод MyClient Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26.
таким образом нажатие на кнопку не приводит к блокировке UI, асинхронно приложение ломится куда-то там и что-то делает через HttpClient (полностью асинхронный клиент). работу можно отменить через CancellationTokenSource. ну и поменьше заморочек с контекcтом. Я правильно понимаю, что в вашем примере применен подход - " async повсюду"? И основное правило тут - async должен оканчиваться методом c возвратом void? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2013, 07:39 |
|
await,async и TASK - не получается.
|
|||
---|---|---|---|
#18+
MonochromatiqueЯ правильно понимаю, что в вашем примере применен подход - " async повсюду"? И основное правило тут - async должен оканчиваться методом c возвратом void? в ином случае использование async бесмысленно. если вы хотите создать асинхронное приложение, т.е. чтобы работа в фоне не блокировало работу UI интерфейса (как вы говорите, не морозило), то вам придётся применить один из подходов для разработки асинхронных приложений. их есть несколько. async — самый простой на сегодняшний день. async метод должен возвращать Task или Task<T>. возврат void это сахар. если метод Method() возвращает Task<string>, то вот такой вызов: var result = await Method(); в результате result сохранит string. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2013, 07:56 |
|
await,async и TASK - не получается.
|
|||
---|---|---|---|
#18+
hVostt async метод должен возвращать Task или Task<T>. возврат void это сахар. Какой же это сахар, ты что. Классический пример с "void button1_Click". Но рекомендация MS гласит, что по возможности нужно возвращать Task. http://msdn.microsoft.com/ru-ru/library/vstudio/hh524395.aspx Основное использование возвращаемого значения void (процедуры Sub в Visual Basic) — в обработчиках событий, где требуется возвращать значение типа void. Возврат void также можно использовать для переопределения возвращающих void методов или для методов, выполняющих действия, которые подчиняются принципу "отправить и забыть". Однако необходимо возвращать Task всегда, когда это возможно, поскольку асинхронные методы, возвращающие void, ожидать невозможно. Любой вызывающий объект такого метода должен иметь возможность продолжить работу до завершения, не дожидаясь завершения вызванного асинхронного метода, и он не должен зависеть ни от каких значений и исключений, создаваемых асинхронным методом. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2013, 09:59 |
|
await,async и TASK - не получается.
|
|||
---|---|---|---|
#18+
МСУ, а ну я имел в виду, что Task в любом случае создается, только если использовать void он теряется. однако "сахар" потому что для button_Click фреймворк его или обёртывает в прокси-метод или ещё как-то, но выковыривает Task. исходников нет, чтобы посмотреть. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2013, 10:32 |
|
await,async и TASK - не получается.
|
|||
---|---|---|---|
#18+
у меня по ходу дела встречный вопрос возник Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
если вот так в finally обнулять используемое в using значение, не потеряется ли вызов Dispose ? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2013, 10:34 |
|
await,async и TASK - не получается.
|
|||
---|---|---|---|
#18+
hVosttМСУ, а ну я имел в виду, что Task в любом случае создается, только если использовать void он теряется. однако "сахар" потому что для button_Click фреймворк его или обёртывает в прокси-метод или ещё как-то, но выковыривает Task. исходников нет, чтобы посмотреть. т.е. не в целом фреймворк, а конкретно WinForms. ему Task от обработчика события нужен, чтобы правильно завершить приложения, если юзер нажмёт на крестик в углу. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2013, 10:41 |
|
await,async и TASK - не получается.
|
|||
---|---|---|---|
#18+
hVosttдля button_Click фреймворк его или обёртывает в прокси-метод или ещё как-то, но выковыривает Task Откуда информация о тасковых выковыриваниях? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2013, 10:54 |
|
await,async и TASK - не получается.
|
|||
---|---|---|---|
#18+
МСУhVosttдля button_Click фреймворк его или обёртывает в прокси-метод или ещё как-то, но выковыривает Task Откуда информация о тасковых выковыриваниях? информации нет, я типо просто так утверждаю, на основе логических рассужденей. может и не выковыривает. тогда хз, что должно произойти при закрытии приложения, если в таске что-нибудь крутится. как винформс пошлёт мессадж в поток об экстренном завершении? или просто грохнет? я просто винформс не очень глубоко изучал. делаю иногда несложные утилиты для выковыривания и отображения данных из сервисов и БД. без асинка вообще ужас был, прям ненависть ненависть. а щас хорошо )) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2013, 11:17 |
|
await,async и TASK - не получается.
|
|||
---|---|---|---|
#18+
hVosttМСУпропущено... Откуда информация о тасковых выковыриваниях? из сервисов и БД. без асинка вообще ужас был, прям ненависть ненависть. а щас хорошо )) А в чем, пардон, ужас? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2013, 13:03 |
|
await,async и TASK - не получается.
|
|||
---|---|---|---|
#18+
MonochromatiqueА в чем, пардон, ужас? в бэкграундворкере и в ручном разруливании контекстов. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2013, 13:51 |
|
await,async и TASK - не получается.
|
|||
---|---|---|---|
#18+
MonochromatiqueВ идеале хочется, не морозя UI получить ответ и дальше с ним работать. С помощью TPL я так понял это можно сделать. Но я не понимаю как. Для WPF можно задействовать Dispatcher.PushFrame см. Samples for Parallel Programming Samples for Parallel Programming Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35.
Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2013, 17:36 |
|
await,async и TASK - не получается.
|
|||
---|---|---|---|
#18+
hVosttесли вот так в finally обнулять используемое в using значение, не потеряется ли вызов Dispose ? "Свою" переменную using не позволит обнулить, ведь он для того и придуман, чтобы гарантированно вызвать Dispose (т.е., обнулится переменная, объявленная выше using) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2013, 20:18 |
|
await,async и TASK - не получается.
|
|||
---|---|---|---|
#18+
Прицеплюсь к теме, чтобы не плодить новых. Не понимаю деталей выполнения async методов, а точнее того, в каком потоке будет выполнятся "окончание" асинхронного метода (то, что ожидает результата вызова await и все после него). В букварях утверждают что окончание метода будет выполнено в потоке, который вызвал асинхронный метод. Однако или это не всегда так, или я люто туплю. Пожалуйста растолкуйте. Есть форма с асинхронным методом: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29.
При ее запуске в InitializeComponent будет вызван btnCallMethod_Click (просто чтобы на кнопку не давить. по кнопке происходит то же самое), который является асинхронным методом. Строка Код: c# 1.
будет выполнена после окончания работы метода DoWork в потоке, который вызвал btnCallMethod_Click (DoWork будет выполнен в другом потоке). Все в точности как по учебнику. Однако если использовать консольное приложение со следующим кодом: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29.
то строка Код: c# 1.
будет выполнена в потоке, который выполнял MyTask, т.е. отличном от того, в котором выполнялась строка Код: c# 1.
. Почему так происходит? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2014, 13:54 |
|
await,async и TASK - не получается.
|
|||
---|---|---|---|
#18+
up ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2014, 17:26 |
|
await,async и TASK - не получается.
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2014, 17:30 |
|
await,async и TASK - не получается.
|
|||
---|---|---|---|
#18+
Lelouch, Суть в "По умолчанию используется текущий SynchronizationContext, т.е. если задача запущена из UI-потока, то продолжение будет тоже выполнено в UI потоке (по аналогии с Dispatcher.BeginInvoke). Если текущий sync-контекст пустой, то используется TaskScheduler.Current." ? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2014, 19:57 |
|
await,async и TASK - не получается.
|
|||
---|---|---|---|
#18+
Lamo2012, а где у вас в примере поток UI ? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2014, 20:10 |
|
await,async и TASK - не получается.
|
|||
---|---|---|---|
#18+
Lamo2012, проверьте значение SynchronizationContext.Current . Что то мне подсказывает, что оно пустое. Поток, в котором выполняется метод Main не имеет контекста синхронизации. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2014, 20:18 |
|
await,async и TASK - не получается.
|
|||
---|---|---|---|
#18+
Lelouch, Спасибо! Похоже дело именно в этом. Вот в этой статье вопрос планирования продолжений рассмотрен чуть более детально. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2014, 20:30 |
|
await,async и TASK - не получается.
|
|||
---|---|---|---|
#18+
Отвечая на вопрос Monochromatique из первого поста (будет полезно тем, кто потом случайно будет находить эту тему поиском), добавлю ссылки на эти 2 полезные статьи http://blogs.msdn.com/b/pfxteam/archive/2009/06/09/9716439.aspx http://msdn.microsoft.com/ru-ru/magazine/ff959203.aspx В первой статье кратко, сжато (и сложно), а во второй полно, описан переход от старых моделей многопоточного программирования, к новой, с блэкджеком и Task'ами. В частности рассмотрен метод Task.Factory.FromAsync позволяющий обернуть асинхронные Begin End в Task с последующем ожиданием в async. Там еще много чего полезного. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2014, 21:27 |
|
await,async и TASK - не получается.
|
|||
---|---|---|---|
#18+
Парни, а можно как-то незамороченно ловить исключения? Каждую залипуху в других потоках надо специально ловить - код превращается черте-во-что. Пока выяснил, почему не работает банальный LINQ2SQL - три блока пришлось расставить. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2014, 00:59 |
|
|
start [/forum/topic.php?fid=20&msg=38449175&tid=1403191]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
51ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
66ms |
get tp. blocked users: |
1ms |
others: | 323ms |
total: | 486ms |
0 / 0 |