1
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();
        };

私の唯一の問題は、プログラムがダウンロードしたファイルを抽出しているときです

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

一部のファイルでは、ダウンロードしたファイルを抽出するのに時間がかかるため、解凍が完了するまでプログラムに待機するように指示するにはどうすればよいですか? (私はBackgroundWorkerを使用しています)

4

1 に答える 1

0

このタイプの処理を処理する最も洗練された方法は、TPL データフローを使用することです。

http://msdn.microsoft.com/en-us/devlabs/gg585582.aspx

そのためには、既存のコードを少しリファクタリングする必要があります。しかし、秩序のある並列プログラミングのタスクを表現する優れたメカニズムを提供します。この種のコードを頻繁に作成する場合は、時間をかけて Dataflow を学習する価値があります。

それができない場合は、AutoResetEvent を見てください。依存するタスクが完了するまで、リソースを消費することなく、1 つのタスクを待機させることができます。

イベントが発生したことを待機中のスレッドに通知します

http://msdn.microsoft.com/en-us/library/system.threading.autoresetevent.aspx

于 2012-12-02T20:01:35.607 に答える