2013-02-22 56 views
0

我有一個嚴重的問題。我目前正在執行一個修補程序。
程序中有一個「Patch」按鈕,如果用戶點擊它,下載開始。
目前該程序需要下載5個文件。下載是正確的,程序的這部分工作正常,但是當我點擊Patch按鈕時,程序開始滯後,我無法關閉或者改變它的位置。 下面的代碼:C#下載滯後

私人無效的button1_Click(對象發件人,EventArgs的) { 線程線程=新主題(新的ThreadStart(this.download)); thread.Start(); }

public void download() 
    { 
     int downloaded = 0; 
     int all = 5; 
     WebClient myWebClient = new WebClient(); 

     if (button1.InvokeRequired) 
     { 
      MethodInvoker MethodControll = new MethodInvoker(download); 
      this.button1.Invoke(MethodControll); 
     } 
     else 
     { 

      double state; 
      jelenlegidownload.Text = "alut.dll"; 
      myWebClient.DownloadFile(Files.alutDLL, "alut.dll"); 
      downloaded++; 
      state = downloaded/all * 100; 
      progressBar.Value = Convert.ToInt32(state); 
      progressBar.Refresh(); 
      this.Refresh(); 

      jelenlegidownload.Text = "BlackBox.dll"; 
      myWebClient.DownloadFile(Files.BlackBoxDLL, "BlackBox.dll"); 
      downloaded++; 
      state = downloaded/all * 100; 
      progressBar.Value = Convert.ToInt32(state); 
      progressBar.Refresh(); 
      this.Refresh(); 

      jelenlegidownload.Text = "DevIL.dll"; 
      myWebClient.DownloadFile(Files.DevILDLL, "DevIL.dll"); 
      downloaded++; 
      state = downloaded/all * 100; 
      progressBar.Value = Convert.ToInt32(state); 
      progressBar.Refresh(); 
      this.Refresh(); 

      jelenlegidownload.Text = "fltkdll.dll"; 
      myWebClient.DownloadFile(Files.fltkdllDLL, "fltkdll.dll"); 
      downloaded++; 
      state = downloaded/all * 100; 
      progressBar.Value = Convert.ToInt32(state); 
      progressBar.Refresh(); 
      this.Refresh(); 

      jelenlegidownload.Text = "glut32.dll"; 
      myWebClient.DownloadFile(Files.glut32DLL, "glut32.dll"); 
      downloaded++; 
      state = downloaded/all * 100; 
      progressBar.Value = Convert.ToInt32(state); 
      progressBar.Refresh(); 
      this.Refresh(); 

的Files.cs:

public class Files 
{ 
    public static string alutDLL = "https://dl.dropbox.com/s/62tt9w194xefk7t/alut.dll?token_hash=AAHQmybYdR44TRrS9bWQWV7jlZBzZQ-mmmjNy1Kv_qR4cg&dl=1"; 
    public static string BlackBoxDLL = "https://dl.dropbox.com/s/vtdrl8qdpky8p08/BlackBox.dll?token_hash=AAHCtQPBJ5s-3aL5B4FqrmOUIGP6BVvW8ZQeWd-xBzysTw&dl=1"; 
    public static string DevILDLL = "https://dl.dropbox.com/s/spni307vmk4zng9/DevIL.dll?token_hash=AAEmZdQj3dv2NIEh6tcWwkgyJHCytSsX65QXZyNGY2Vl1w&dl=1"; 
    public static string fltkdllDLL = "https://dl.dropbox.com/s/fsa29pelfwgk5ha/fltkdll.dll?token_hash=AAF55SuU_8bfli5gIiPpA-VLWUmZKLbOK-Ys8iokuJ8_XA&dl=1"; 
    public static string glut32DLL = "https://dl.dropbox.com/s/cptiwxv17nhtywp/glut32.dll?token_hash=AAGCNXQPpwrByjp-uG_avBbkNyNjTfOJFxbY3ieNAfLzVw&dl=1"; 
} 

我怎樣才能解決這個滯後? (正如我之前所說,如果我點擊「Patch」按鈕,文件正在下載,但程序「停止」)

回答

1

要停止應用程序的下載部分以阻止應用程序的UI部分,爲什麼不要你在不同的線程上做下載工作嗎?這樣,即使下載沒有完成,您的用戶界面仍然會響應。

編輯:我認爲這是一個適用於你的情況有很大的文章:

http://www.developerfusion.com/article/4134/net-threading-part-i/

+0

我要試一試。 – werck 2013-02-22 14:33:58

+0

祝你好運,我確定你會得到理想的結果。 – Freeman 2013-02-22 14:34:52

+0

謝謝。希望這會工作:) – werck 2013-02-22 14:39:02

0

我想你誤會InvokeRequired

MSDN

獲取一個值指示,因爲呼叫者是上一個 不同的線程比控制創建所述一個主叫方是否必須調用Invoke方法 當使方法調用的控制。

基本上,你開始在另一個線程下載。但是,由於這會導致InvokeRequired爲真,因此您應該回想一下GUI線程中的方法,即鎖定應用程序。

如果您刪除此部分,它會更好嗎?

if (button1.InvokeRequired) 
    { 
     MethodInvoker MethodControll = new MethodInvoker(download); 
     this.button1.Invoke(MethodControll); 
    } 

更新 爲了排除你做錯事與你的進度條,儘量簡化您的下載方法是:

public void download() 
{ 
    WebClient myWebClient = new WebClient(); 

    myWebClient.DownloadFile(Files.alutDLL, "alut.dll"); 
    myWebClient.DownloadFile(Files.BlackBoxDLL, "BlackBox.dll"); 
    myWebClient.DownloadFile(Files.DevILDLL, "DevIL.dll"); 
    myWebClient.DownloadFile(Files.fltkdllDLL, "fltkdll.dll"); 
    myWebClient.DownloadFile(Files.glut32DLL, "glut32.dll"); 
} 

應該使沒有延遲下載的文件,但您希望在進度欄中看到更新(顯然)。

+0

仍然laggy,並最終,我有一個InvalidOperationException。 – werck 2013-02-22 14:31:17