2012-12-02 2 views
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(); 
     }; 

Моя единственная проблема сейчас, когда программа извлечения загруженного файлаAction <>, ждать дополнительных действий, чтобы завершить

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

В некоторых файлах свое время тейк извлечь загруженный файл так как я могу сказать программе дождаться завершения распаковки? (я использую BackgroundWorker)

+0

Фоновый работник создает событие, когда работа завершена. Вы пытались присоединить обработчик событий к этому событию? –

+0

да я сделал. Проблема заключается в том, что backgroungworker заканчивается до завершения загрузки файла curret –

ответ

0

На сегодняшний день самым элегантным способом обработки этого типа обработки является использование потока данных TPL.

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

Это потребует вам реорганизовать существующий код немного. Тем не менее, он обеспечивает выдающийся механизм для выражения параллельных задач программирования, которые имеют смысл для них. Потребуется потратить время на изучение Dataflow, если вы напишете этот тип кода с любой частотой.

Если это не вариант, посмотрите на AutoResetEvent. Это позволит одной задаче подождать, не потребляя ресурсы, до тех пор, пока задача, от которой она зависит, закончена.

Уведомляет ожидающий поток, что событие произошло

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

Смежные вопросы