Ошибка загрузчика мультифайлов в WebClient - PullRequest
0 голосов
/ 06 октября 2011

я использую следующий код для загрузки более 50 файлов с моего веб-сервера

private void button5_Click(object sender, EventArgs e)
{

WebClient client = new WebClient();
client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged);
client.DownloadFileCompleted += new AsyncCompletedEventHandler(client_DownloadFileCompleted);

//downloads
client.DownloadFileAsync(new Uri("http://www.site.com/file/loc.file"), @"c:\app\loc ");
client.DownloadFileAsync(new Uri("http://www.site.com/file/loc.file"), @"c:\app\loc ");
client.DownloadFileAsync(new Uri("http://www.site.com/file/loc.file"), @"c:\app\loc ");
 }

           void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
    {
        double bytesIn = double.Parse(e.BytesReceived.ToString());
        double totalBytes = double.Parse(e.TotalBytesToReceive.ToString());
        double percentage = bytesIn / totalBytes * 100;
        progressBar.Value = int.Parse(Math.Truncate(percentage).ToString());
    }

    private void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
    {
        MessageBox.Show("Game Update Finished!");
    }

я хочу загружать по 1 файлу за раз с непрерывным индикатором выполнения, и я выполнил большую часть кода, но когда я нажалПри нажатии кнопки «Загрузить» я получаю следующую ошибку

WebClient не поддерживает параллельные операции ввода-вывода.

что мне нужно сделать?

Ответы [ 3 ]

2 голосов
/ 11 апреля 2013

Почувствуй разницу:

  • МОЖЕТ загружать несколько файлов параллельно (по одному потоку на один файл).
  • Но он НЕ МОЖЕТ загружать один файл, используя несколько потоков.

Вот пример (MainWindow содержит одну кнопку «Пуск» и пять индикаторов выполнения):

public partial class MainWindow : Window
{
    private WebClient _webClient;
    private ProgressBar[] _progressBars;
    private int _index = 0;

    public MainWindow()
    {
        InitializeComponent();
        _progressBars = new [] {progressBar1, progressBar2, progressBar3, progressBar4, progressBar5};
        ServicePointManager.DefaultConnectionLimit = 5;
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        Interlocked.Increment(ref _index);
        if (_index > _progressBars.Length)
            return;

        _webClient = new WebClient();
        _webClient.DownloadProgressChanged += WebClient_DownloadProgressChanged;
        _webClient.DownloadFileCompleted += WebClient_DownloadFileCompleted;

        _webClient.DownloadFileAsync(new Uri("http://download.thinkbroadband.com/5MB.zip"),
                                     System.IO.Path.GetTempFileName(),
                                     _index);
    }

    private void WebClient_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs args)
    {
        var index = (int) args.UserState;
        _progressBars[index-1].Value = args.ProgressPercentage;
    }

    private void WebClient_DownloadFileCompleted(object sender, AsyncCompletedEventArgs args)
    {
        var index = (int)args.UserState;

        MessageBox.Show(args.Error == null
                            ? string.Format("Download #{0} completed!", index)
                            : string.Format("Download #{0} error!\n\n{1}", index, args.Error));
    }
}
1 голос
/ 06 октября 2011

вы выполняете несколько загрузок параллельно с одним и тем же экземпляром WebClient - ошибка говорит вам, что это НЕ поддерживается - вы либо:

  • использовать несколько экземпляров WebClient (по одному на параллельную загрузку) OR
  • загрузка одного файла за другим

Соответствующая информация:

0 голосов
/ 06 октября 2011

WebClient не поддерживает одновременные операции ввода-вывода (несколько загрузок) для каждого экземпляра, поэтому вам нужно создавать отдельный экземпляр WebClient для каждой загрузки.Вы по-прежнему можете выполнять каждую загрузку асинхронно и использовать одни и те же обработчики событий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...