powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Async, await и Task<T> на примере загрузки страниц
7 сообщений из 7, страница 1 из 1
Async, await и Task<T> на примере загрузки страниц
    #38686258
AlexanderWM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть у меня обычный метод, для получения содержимого страниц 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.
public static string Get(string url, bool clearCookie, ref CookieContainer container)
        {
            string output = null;
            try
            {
                HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create(url);
                if (clearCookie) WebReq.CookieContainer = new CookieContainer();
                else WebReq.CookieContainer = container;
                WebReq.Method = "GET";
                WebReq.AllowAutoRedirect = true;
                WebReq.ContentType = "application/x-www-form-urlencoded";

                HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse();
                Stream Answer = WebResp.GetResponseStream();
                container = WebReq.CookieContainer;
                StreamReader _Answer = new StreamReader(Answer, Encoding.GetEncoding(1251));
                output = _Answer.ReadToEnd();
                return output.Trim() + "\n";
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }



Пока всё было линейно - проблем не было. Сейчас встала задача получать содержимое страниц асинхронно. Вот и нужно переписать этот метод с помощью модных async/await

И сразу возникли вопросы. Асинхронные методы - либо void, либо возвращают Task<T>. В моём случае логично написать
public async Task<string> Get (string url, bool clearCookie, ref CookieContainer container)
...
а в коде позаменять GetResponse() на GetResponseAsync().


Что дальше - непонятно. Совсем. В результате я получу Task<string>. Как из этого результата "выдрать" нужные мне string? Как вообще обращаться с этим методом? Помогите, пожалуйста, с методом для асинхронной загрузки страницы.
...
Рейтинг: 0 / 0
Async, await и Task<T> на примере загрузки страниц
    #38686271
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexanderWM ,
В смысле "как работать с Task"? Ну вы API его смотрели? Когда вам понадобится результат, вызываете на нем Result, который дождется окончания работы и вернет вам стрингу. Но это немного неверный подход, так как вы все равно где-то будете ждать его завершения.
Вместо этого вам надо внутри вашего метода вызвать await на какой-нибудь асинхронной операции чтения URL, потом вызвать await на ее результате, а потом написать код обработки результата. Вот и все. Таким образом, когда поток, который реально вытаскивает данные с веба, завершит выполнение, он подхватит то, что вы написали после await, и выполнит это.
Но радикально ничего не поменяется у вас, это просто синтаксический сахар вокруг обычного Task (хоть и работает он несколько иначе с точки зрения скомпилированного кода), так что не ожидайте чего-то особого.
...
Рейтинг: 0 / 0
Async, await и Task<T> на примере загрузки страниц
    #38686280
AlexanderWM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cdtyjv AlexanderWM ,
В смысле "как работать с Task"? Ну вы API его смотрели? Когда вам понадобится результат, вызываете на нем Result, который дождется окончания работы и вернет вам стрингу. Но это немного неверный подход, так как вы все равно где-то будете ждать его завершения.
Вместо этого вам надо внутри вашего метода вызвать await на какой-нибудь асинхронной операции чтения URL, потом вызвать await на ее результате, а потом написать код обработки результата. Вот и все. Таким образом, когда поток, который реально вытаскивает данные с веба, завершит выполнение, он подхватит то, что вы написали после await, и выполнит это.
Но радикально ничего не поменяется у вас, это просто синтаксический сахар вокруг обычного Task (хоть и работает он несколько иначе с точки зрения скомпилированного кода), так что не ожидайте чего-то особого.
Вы бы не могли для наглядности создать небольшую демонстрацию?
...
Рейтинг: 0 / 0
Async, await и Task<T> на примере загрузки страниц
    #38686282
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Async, await и Task<T> на примере загрузки страниц
    #38686311
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
  class Program
    {
        static Func<string, bool, CookieContainer, string> func;
        static void Main(string[] args)
        {
            func = Get;
            func.BeginInvoke("http://www.sql.ru/forum/1103286/async-await-i-task-t-na-primere-zagruzki-strani", true, new CookieContainer(), MyWorker, null);
            Console.Read();
        }

        static void MyWorker(IAsyncResult result)
        {
           var str= func.EndInvoke(result);
            Console.WriteLine(str);
        }

        public static string Get(string url, bool clearCookie,  CookieContainer container)
        {
            string output = null;
            try
            {
                HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create(url);
                if (clearCookie) WebReq.CookieContainer = new CookieContainer();
                else WebReq.CookieContainer = container;
                WebReq.Method = "GET";
                WebReq.AllowAutoRedirect = true;
                WebReq.ContentType = "application/x-www-form-urlencoded";

                HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse();
                Stream Answer = WebResp.GetResponseStream();
                container = WebReq.CookieContainer;
                StreamReader _Answer = new StreamReader(Answer, Encoding.GetEncoding(1251));
                output = _Answer.ReadToEnd();
                return output.Trim() + "\n";
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }
    }



что то меня смущает отлов исключения без выброса выше, нарушен принцип самурая..
...
Рейтинг: 0 / 0
Async, await и Task<T> на примере загрузки страниц
    #38686326
AlexanderWM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо! Вполне интересное решение. Отдельное спасибо, за то, что заставили погуглить про принцип самурая :)
...
Рейтинг: 0 / 0
Async, await и Task<T> на примере загрузки страниц
    #38686346
john2007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В принципе все сказали.

Можно в одном методе при желании.


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)
{
...........
}
}
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Async, await и Task<T> на примере загрузки страниц
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]