|
Async, await и Task<T> на примере загрузки страниц
|
|||
---|---|---|---|
#18+
Есть у меня обычный метод, для получения содержимого страниц GET методов. При необходимости - с использованием кук Код: 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.
Пока всё было линейно - проблем не было. Сейчас встала задача получать содержимое страниц асинхронно. Вот и нужно переписать этот метод с помощью модных async/await И сразу возникли вопросы. Асинхронные методы - либо void, либо возвращают Task<T>. В моём случае логично написать public async Task<string> Get (string url, bool clearCookie, ref CookieContainer container) ... а в коде позаменять GetResponse() на GetResponseAsync(). Что дальше - непонятно. Совсем. В результате я получу Task<string>. Как из этого результата "выдрать" нужные мне string? Как вообще обращаться с этим методом? Помогите, пожалуйста, с методом для асинхронной загрузки страницы. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2014, 22:26 |
|
Async, await и Task<T> на примере загрузки страниц
|
|||
---|---|---|---|
#18+
AlexanderWM , В смысле "как работать с Task"? Ну вы API его смотрели? Когда вам понадобится результат, вызываете на нем Result, который дождется окончания работы и вернет вам стрингу. Но это немного неверный подход, так как вы все равно где-то будете ждать его завершения. Вместо этого вам надо внутри вашего метода вызвать await на какой-нибудь асинхронной операции чтения URL, потом вызвать await на ее результате, а потом написать код обработки результата. Вот и все. Таким образом, когда поток, который реально вытаскивает данные с веба, завершит выполнение, он подхватит то, что вы написали после await, и выполнит это. Но радикально ничего не поменяется у вас, это просто синтаксический сахар вокруг обычного Task (хоть и работает он несколько иначе с точки зрения скомпилированного кода), так что не ожидайте чего-то особого. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2014, 22:48 |
|
Async, await и Task<T> на примере загрузки страниц
|
|||
---|---|---|---|
#18+
cdtyjv AlexanderWM , В смысле "как работать с Task"? Ну вы API его смотрели? Когда вам понадобится результат, вызываете на нем Result, который дождется окончания работы и вернет вам стрингу. Но это немного неверный подход, так как вы все равно где-то будете ждать его завершения. Вместо этого вам надо внутри вашего метода вызвать await на какой-нибудь асинхронной операции чтения URL, потом вызвать await на ее результате, а потом написать код обработки результата. Вот и все. Таким образом, когда поток, который реально вытаскивает данные с веба, завершит выполнение, он подхватит то, что вы написали после await, и выполнит это. Но радикально ничего не поменяется у вас, это просто синтаксический сахар вокруг обычного Task (хоть и работает он несколько иначе с точки зрения скомпилированного кода), так что не ожидайте чего-то особого. Вы бы не могли для наглядности создать небольшую демонстрацию? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2014, 23:04 |
|
Async, await и Task<T> на примере загрузки страниц
|
|||
---|---|---|---|
#18+
AlexanderWM , http://msdn.microsoft.com/en-us/library/hh191443.aspx ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2014, 23:11 |
|
Async, await и Task<T> на примере загрузки страниц
|
|||
---|---|---|---|
#18+
AlexanderWM, может проще сделать, нативно - народными средствами? Код: 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. 36. 37. 38. 39. 40. 41.
что то меня смущает отлов исключения без выброса выше, нарушен принцип самурая.. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2014, 00:31 |
|
Async, await и Task<T> на примере загрузки страниц
|
|||
---|---|---|---|
#18+
Спасибо! Вполне интересное решение. Отдельное спасибо, за то, что заставили погуглить про принцип самурая :) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2014, 01:17 |
|
Async, await и Task<T> на примере загрузки страниц
|
|||
---|---|---|---|
#18+
В принципе все сказали. Можно в одном методе при желании. class Program { public delegate string GetDelegate (string s, bool b, CookieContainer cc); static void Main(string[] args) { GetDalegate func; var ar = func.BeginInvoke(" http://www.sql.ru/forum/1103286/async-await-i-task-t-na-primere-zagruzki-strani", true, new CookieContainer(), null, null); // делаем, что хотим // можем при желании проверить // if (ar.IsCompleted) { } var s = func.EndIvoke(ar) // получили результат public string GetDelegate (string s, bool b, CookieContainer cc) { ........... } } ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2014, 02:34 |
|
|
start [/forum/topic.php?fid=20&fpage=115&tid=1402743]: |
0ms |
get settings: |
12ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
38ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
2ms |
others: | 12ms |
total: | 139ms |
0 / 0 |