Web Client DownloadStringAsync проблема, парсинг
Цитата: Удаленный пользователь от 24.07.2022, 16:03Всем доброго!
У меня есть метод, который качает указанный день API
[spoiler title="Метод"]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 в лист }[/spoiler]
Как бы я не пытался сделать эту скачку асинхронной, не получается.
Пробовал через DownloadStringAsync, выдаёт ошибку
web client не поддерживает параллельные операции ввода-выводаКто-то сталкивался с этим?
Всем доброго!
У меня есть метод, который качает указанный день 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 не поддерживает параллельные операции ввода-вывода
Кто-то сталкивался с этим?
Цитата: Удаленный пользователь от 24.07.2022, 16:51Приветствую. Я предполагаю, что асинхронность этого устаревшего класса предполагалась через событие. Я сделал набросок как примерно это должно выглядеть. [spoiler title="Код"]
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;[/spoiler]
И вроде там одно действие на экземпляр класса(до его завершения, потом можно далее использовать).
Приветствую. Я предполагаю, что асинхронность этого устаревшего класса предполагалась через событие. Я сделал набросок как примерно это должно выглядеть.
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 от 24.07.2022, 16:58Привет 🖐
Хотя с ответом опередили, дам вариант, который минимально меняет первоначальный.
[spoiler title="Просто меняем подход. Вместо 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 в лист }[/spoiler]
Привет 🖐
Хотя с ответом опередили, дам вариант, который минимально меняет первоначальный.
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 в лист
}
Цитата: Удаленный пользователь от 24.07.2022, 17:01Спасибо за ответы!
Хачатур, а почему перешёл на HttpClient?
Спасибо за ответы!
Хачатур, а почему перешёл на HttpClient?
Цитата: Удаленный пользователь от 24.07.2022, 17:23Цитата: Клякнутый кля от 24.07.2022, 17:01Спасибо за ответы!
Хачатур, а почему перешёл на HttpClient?Приветствую
Цитата: Клякнутый кля от 24.07.2022, 17:01Спасибо за ответы!
Хачатур, а почему перешёл на HttpClient?
Приветствую
Цитата: Удаленный пользователь от 24.07.2022, 17:25Окей, почитаю, спасибо
Окей, почитаю, спасибо
