Daniel Bublil
Daniel Bublil

Reputation: 66

WebClient does not support concurrent I/O operations

I did what @Enigmativity write here it is:

        Action<int, ProgressBar, Label, Label, int, Button> downloadFileAsync = (i, pb, label2, label1, ServID, button1) =>
    {
        var bd = AppDomain.CurrentDomain.BaseDirectory;
        var fn = bd + "/" + i + ".7z";
        var down = new WebClient();
        DownloadProgressChangedEventHandler dpc = (s, e) =>
        {
            label1.Text = "Download Update: " + i + " From: " + ServID;
            int rec =Convert.ToInt16(e.BytesReceived / 1024);
            int total =Convert.ToInt16(e.TotalBytesToReceive / 1024)  ;
            label2.Text = "Downloaded: " + rec.ToString() + " / " + total.ToString() + " KB";
            pb.Value = e.ProgressPercentage;
        };
        AsyncCompletedEventHandler dfc = null;  dfc = (s, e) =>
        {
            down.DownloadProgressChanged -= dpc;
            down.DownloadFileCompleted -= dfc;
            CompressionEngine.Current.Decoder.DecodeIntoDirectory(AppDomain.CurrentDomain.BaseDirectory + "/" + i + ".7z", AppDomain.CurrentDomain.BaseDirectory);
            File.Delete(fn);
               if (i == ServID)
                {

                   button1.Enabled = true;
                   label1.Text = "Game Is Up-To-Date.Have Fun!!";
                  label2.Text = "Done..";
               }
         down.Dispose();
        };

My only problam now is when the program is extarting the downloaded file

CompressionEngine.Current.Decoder.DecodeIntoDirectory(AppDomain.CurrentDomain.BaseDirectory + "/" + i + ".7z", AppDomain.CurrentDomain.BaseDirectory);

In some files its take time to extarct the downloaded file so how i can tell the program to wait until decompressing is complete?

Upvotes: 0

Views: 2192

Answers (1)

Enigmativity
Enigmativity

Reputation: 117084

Try defining a single lambda that will encapsulate a single async download and then call that in a loop.

Here's the lambda:

Action<int> downloadFileAsync = i =>
{
    var bd = AppDomain.CurrentDomain.BaseDirectory;
    var fn = bd + "/" + i + ".7z";
    var wc = new WebClient();
    DownloadProgressChangedEventHandler dpc = (s, e) =>
    {
        progressBar1.Value = e.ProgressPercentage;
    };
    AsyncCompletedEventHandler dfc = null;
    dfc = (s, e) =>
    {
        wc.DownloadProgressChanged -= dpc;
        wc.DownloadFileCompleted -= dfc;
        CompressionEngine.Current.Decoder.DecodeIntoDirectory(fn, bd);
        File.Delete(fn);
        wc.Dispose();
    };
    wc.DownloadProgressChanged += dpc;
    wc.DownloadFileCompleted += dfc;
    wc.DownloadFileAsync(new Uri(Dlpath + i + "/" + i + ".7z"), fn);
};

You'll note that it nicely detaches all events and also correctly disposes of the WebClient instance.

Now call it like this:

while (i <= ServID)
{
    downloadFileAsync(i);
    i++;
}

You'll have to fiddle with the progress bar update to properly show the progress of all the files downloading, but in principle this should work for you.

Upvotes: 2

Related Questions