Forum

Пожалуйста or Регистрация для создания сообщений и тем.

Web Client DownloadStringAsync проблема, парсинг

Всем доброго!

У меня есть метод, который качает указанный день API

Метод

void DownloadDay(int d, List<string> list) // Скачиваем указанный день и добавляем API в указанный лист
{
    using (WebClient wc = new WebClient())
    {
        if (d <= 9)
            day = $"0{d}"; // Т.к в API надо добавить нолик типо 01/03/2020
        else
            day = d.ToString();
        if (currentMonth <= 9)
            month = $"0{currentMonth}";
        else
            month = currentMonth.ToString();

        line = wc.DownloadString($"https://www.cbr.ru/scripts/XML_daily.asp?date_req={day}/{month}/{currentYear}"); // Скачиваем API
    }

    list.Add(line); // Добавляем API в лист
}

Как бы я не пытался сделать эту скачку асинхронной, не получается.
Пробовал через DownloadStringAsync, выдаёт ошибку
Скопированоweb client не поддерживает параллельные операции ввода-вывода

Кто-то сталкивался с этим?

Приветствую. Я предполагаю, что асинхронность этого устаревшего класса предполагалась через событие.  Я сделал набросок как примерно это должно выглядеть.

Код

WebClient wc = new WebClient();
           async void Completed(object sender, DownloadStringCompletedEventArgs e)
           {
               if (!InvokeRequired)
               {
                   await Task.Run(() =>
                   {

                       if (!e.Cancelled && e.Error == null)
                       {
                           string textString = e.Result;

                           Console.WriteLine(textString);
                       }

                       ((WebClient)sender).Dispose();
                       wc.DownloadStringCompleted -= Completed;

                   });
               }
               else
               {
                   if (!e.Cancelled && e.Error == null)
                   {
                       string textString = e.Result;

                       Console.WriteLine(textString);
                   }

                   ((WebClient)sender).Dispose();
                   wc.DownloadStringCompleted -= Completed;
               }
           }
           wc.DownloadStringAsync(new Uri($"https://www.cbr.ru/scripts/XML_daily.asp?date_req=01/03/2020"));
           wc.DownloadStringCompleted += Completed;


И вроде там одно действие на экземпляр класса(до его завершения, потом можно далее использовать).

admin отреагировал на эту запись.
admin

Привет 🖐
Хотя с ответом опередили, дам вариант, который минимально меняет первоначальный.

Просто меняем подход. Вместо WebClient используем HttpClient:

async void DownloadDay(int d, List<string> list) // Скачиваем указанный день и добавляем API в указанный лист
{
    if (d <= 9)
        day = $"0{d}"; // Т.к в API надо добавить нолик типо 01/03/2020
    else
        day = d.ToString();
    if (currentMonth <= 9)
        month = $"0{currentMonth}";
    else
        month = currentMonth.ToString();

    using (var net = new HttpClient())
    {
        var response = await net.GetAsync($"https://www.cbr.ru/scripts/XML_daily.asp?date_req={day}/{month}/{currentYear}"); // Скачиваем API
        line = response.IsSuccessStatusCode ? await response.Content.ReadAsStringAsync() : null;
    }

    list.Add((string)line); // Добавляем API в лист
}            

Удаленный пользователь отреагировал на эту запись.
Удаленный пользователь

Спасибо за ответы!
Хачатур, а почему перешёл на HttpClient?

Цитата: Клякнутый кля от 24.07.2022, 17:01

Спасибо за ответы!
Хачатур, а почему перешёл на HttpClient?

Приветствую

admin, Удаленный пользователь и Удаленный пользователь отреагировали на эту запись.
adminУдаленный пользовательУдаленный пользователь

Окей, почитаю, спасибо

admin отреагировал на эту запись.
admin