2011-04-23 51 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