2011-01-09 19 views
0
using System; 
using System.ComponentModel; 
using System.Net; 
using System.Windows.Forms; 
using Ionic.Zip; 

namespace downloader 
{ 
    public partial class GUI : Form 
    { 
     string desktop = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); 

     public GUI() 
     { 
      InitializeComponent(); 
     } 

     private void Download_Click(object sender, EventArgs e) 
     { 
      label1.Text = ("Downloading..."); 
      WebClient x = new WebClient(); 
      x.DownloadProgressChanged += new DownloadProgressChangedEventHandler(x_DownloadProgressChanged); 
      x.DownloadFileCompleted += new System.ComponentModel.AsyncCompletedEventHandler(x_DownloadFileCompleted); 
      x.DownloadFileAsync(new Uri("http://google.com/"), desktop + "\\index.html"); 
      download.Enabled = false; 
     } 

     void x_DownloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e) 
     { 
      label2.Text = null; 
      label1.Text = "Download Complete."; 
      MessageBox.Show("Download Done.", "Done!"); 
     } 

     public void x_DownloadProgressChanged(Object sender, DownloadProgressChangedEventArgs e) 
     { 
      progressBar.Value = e.ProgressPercentage; 
      this.Text = ":: Kyle :: " + e.ProgressPercentage + "%"; 
      label2.Text = e.BytesReceived + " bytes saved."; 
     } 

     public void unzip(String zFile) 
     { 
      Ionic.Zip.ZipFile zip = Ionic.Zip.ZipFile.Read(zFile); 
      zip.ExtractProgress += new EventHandler<ExtractProgressEventArgs>(zip_ExtractProgress); 
      zip.ExtractAll(desktop, ExtractExistingFileAction.OverwriteSilently); 
      zip.Dispose(); 
      zip = null; 
     } 

     public void zip_ExtractProgress(object sender, ExtractProgressEventArgs e) 
     { 

      if (e.EventType == ZipProgressEventType.Extracting_EntryBytesWritten) 
      { 
       this.label2.Text = e.BytesTransferred.ToString(); //unsafe also? 
      } 
      else if (e.EventType == ZipProgressEventType.Extracting_BeforeExtractEntry) 
      { 
       this.label3.Text = e.CurrentEntry.FileName; //unsafe 
      } 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      button1.Enabled = false; 
      backgroundWorker1.RunWorkerAsync(); 
     } 

     private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) 
     { 
      backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted); 
      unzip(desktop + "\\Client.zip"); 
     } 

     void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
     { 
      button1.Enabled = true; 
      MessageBox.Show("Done Unzipping."); 
     } 

     private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
     { 
      progressBar.Value = e.ProgressPercentage; 
     } 
    } 
} 

如何修復我的文本標籤?我正在使用backgroundWorker,但它在沒有標籤的情況下工作,但是當我擁有它時,它會一直說Cross-thread operation not valid: Control 'label3' accessed from a thread other than the thread it was created on.修復線程從後臺安全調用

回答

1

您應該通過調用BackgroundWorker的ReportProgress方法來報告進度。

或者,您可以通過調用BeginInvoke在UI線程上運行。

+0

您會推薦哪種方法在主UI中獲得更好的性能? – Kyle 2011-01-09 03:16:52