2011-04-23 52 views
4

我有一個應用程序,我在塊上傳文件。我的前端是WPF,我有一個進度條來顯示文件上傳進度(上傳由單獨的線程完成,並且進度條處於上載開始時由子線程調用的單獨表單中)。WPF進度條不顯示正確的進度

我發現文件中的塊的總數來設置進度條的最大屬性。

現在,每塊載我以1

遞增進度條的價值,但讓我吃驚,進度條開始增加,但從來沒有完成(即停止顯示幾個街區後,進度)。

這裏是負責上傳文件線程代碼:

 
System.Threading.Thread thread = new Thread(
    new ThreadStart(
     delegate() 
     { 
       // show progress bar - Progress is the name of window containing progress bar 
       Progress win = new Progress(); 
       win.WindowStartupLocation = System.Windows.WindowStartupLocation.CenterScreen; 
       win.Show(); 

       // find number of blocks 
      long BlockSize = 4096; 
      FileInfo fileInf = new FileInfo(filename); 
      long FileSize = fileInf.Length; 
      long NumBlocks = FileSize/BlockSize; 

      //set the min and max for progress bar 
      win.Dispatcher.Invoke(
        new Action(
        delegate() 
        { 
          win.progressBar1.Minimum = 0; 
          win.progressBar1.Maximum = NumBlocks;               
        } 
      ), System.Windows.Threading.DispatcherPriority.Render); 

      //upload file 
      while (true) 
      { 

         // code to upload the file 

         win.Dispatcher.Invoke(
          new Action(
           delegate() 
           { 
           win.progressBar1.Value += 1; 
           } 
        ), System.Windows.Threading.DispatcherPriority.Render); 

      } 
     } 

有人可以幫我分析一下,爲什麼會出現這種情況。

謝謝。

+1

你期望的人來調試你的代碼,而不必*該代碼的任何*? – 2011-04-23 01:23:48

+0

我很抱歉,從下次開始請記住,謝謝 – Jake 2011-04-23 01:26:40

+0

您可以編輯您的問題並添加代碼。你應該這樣做。 – 2011-04-23 01:27:42

回答

6

這裏的問題:

上傳由單獨的線程完成, 進度條是由子線程調用單獨的形式 時 上傳開始

如果這意味着你的子線程創建了的形式,那就是問題所在。您的子線程可能正在更新進度欄值,但這隻會導致無效顯示,並且不一定會刷新顯示。當一個控件的顯示爲無效時,它只是記錄下一次有機會時它必須重畫它的顯示。 A 刷新是控件實際呈現到屏幕上的時間。

更好的方法是在線程主要線程中創建進度條窗體。

您的工作線程可以更新狀態,並且您的主線程將刷新顯示。

有一點需要記住:如果您要更新在不同線程中創建的控件,則必須通過控件的調度程序進行更新。看到代碼

var dispatcher = progressBar.Dispatcher; 
dispatcher.BeginInvoke(new Action(() => { progressBar.Value = currentProgress })); 


編輯所有你需要做的是移動的進展變量的創建,以便它是由主線程創建輔助線程之前實例化。


Progress win = new Progress(); 
win.WindowStartupLocation = System.Windows.WindowStartupLocation.CenterScreen; 
win.Show(); 
System.Threading.Thread thread = new Thread(
    new ThreadStart(
     delegate() 
     { 
// ... 
+0

謝謝,這解決了這個問題。 – Jake 2011-04-23 01:48:44

+0

請您詳細說明「使顯示無效,不一定刷新顯示」的問題。「..我沒有得到那部分,謝謝。 – Jake 2011-04-23 01:49:51

+0

謝謝你,你一直是一個很好的幫助! :) – Jake 2011-04-23 02:02:44