DispatcherTimer и WebClient.DownloadStringAsync выдает исключение «WebClient не поддерживает параллельные операции ввода-вывода»

#c# #multithreading #concurrency #dispatchertimer

#c# #многопоточность #параллелизм #dispatchertimer

Вопрос:

Мне нужна помощь с этим кодом

 WebClient client = new WebClient();
    string url = "http://someUrl.com"

    DispatcherTimer timer = new DispatcherTimer();
                timer.Interval = TimeSpan.FromSeconds(Convert.ToDouble(18.0));
                timer.Start();

                timer.Tick  = new EventHandler(delegate(object p, EventArgs a)
                {
                     client.DownloadStringAsync(new Uri(url));

                     //throw:
                     //WebClient does not support concurrent I/O operations.
                });

                client.DownloadStringCompleted  = (s, ea) =>
                {
                     //Do something
                };
  

Ответ №1:

Вы используете общий WebClient экземпляр, и таймер, очевидно, вызывает одновременную загрузку нескольких файлов. Каждый раз запускайте новый экземпляр клиента в Tick обработчике или отключите таймер, чтобы он не тикал снова, пока вы все еще обрабатываете текущую загрузку.

 timer.Tick  = new EventHandler(delegate(object p, EventArgs a)
{
    // Disable the timer so there won't be another tick causing an overlapped request
    timer.IsEnabled = false;

    client.DownloadStringAsync(new Uri(url));                     
});

client.DownloadStringCompleted  = (s, ea) =>
{
    // Re-enable the timer
    timer.IsEnabled = true;

    //Do something                
};