2012-02-23 67 views
0

我正在使用进度条向用户显示耗时操作的进度。我的问题是,在执行操作时,背景工作人员无法报告任何进度,直到它完成了。因此,如果我只有一次迭代,进度条总是显示0%,并且完成后,进度条会立即关闭。因此,用户不会感觉到任务已完成。我正在寻找一种方法让用户在progessbar关闭之前知道任务已完成。我的代码如下所示。如何在关闭前100%显示进度条

  this.progressDialog = new progressDialog(); 

      Dispatcher pdDispatcher = ((Window)this.progressDialog).Dispatcher; 

      this.worker = new BackgroundWorker(); 
      this.worker.WorkerSupportsCancellation = true; 
      this.worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged); 
      this.worker.DoWork += delegate(object s, DoWorkEventArgs args) 
      { 
       foreach (Element id in state.Elements) 
       { 
        if (this.worker.CancellationPending) 
        { 
         args.Cancel = true; 
         return; 
        } 

        UpdateProgressDelegate update = new UpdateProgressDelegate(this.UpdateProgressText); 
        pdDispatcher.BeginInvoke(update, Convert.ToInt32(((decimal)state.Elements.IndexOf(id)/(decimal)state.Elements.Count()) * 100), state.Elements.Count()); 

        Element newElement = this.Item.Copy(id); 
        if (newElement .HasValue) 
        { 
         state.CreatedElements.Add(newElement.Value); 
        } 
       } 
      }; 
      this.worker.RunWorkerCompleted += delegate(object s, RunWorkerCompletedEventArgs args) 
      { 
       if (!(args.Error == null)) 
       { 
        throw args.Error; 
       } 
       this.UpdateDisplayItems(); 
       this.progressDialog.Close(); 
       this.progressDialog.Dispose(); 

      }; 

      this.worker.RunWorkerAsync(); 
      this.progressDialog.Show();    
     } 

     void worker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
     { 
      this.progressDialog.Value = e.ProgressPercentage; 
     } 
    public void UpdateProgressText(int percentage, int recordCount) 
    { 
     this.progressDialog.Description = string.Format("{0}% of {1} Records", percentage.ToString(), recordCount); 
     this.progressDialog.Value = percentage; 
    } 
+0

我看不到你在'DoWork'函数中的任何地方调用'worker.ReportProgress'? – Dennis 2012-02-23 06:36:09

+0

@ Dennis我正在使用UpdateProgressText委托调用百分比到我的progressdialog – biju 2012-02-23 06:46:04

+0

progressDialog是自定义对话框吗?你是否将progressDialog.Value绑定到ProgressBar控件?如果您可以分享pr​​ogressDialog的代码,那将会很好。 – 2012-02-23 07:13:07

回答

2

在这种类型的情况下,你可能要考虑IsIndeterminate属性设置为true,忘了设定值。这会给你一个marquee效果,所以用户会得到一些事情正在发生的印象。

+0

似乎是唯一的方法。 – biju 2012-02-23 06:49:28

+0

@biju是的,如果你没有从工作线程获得任何反馈,那么只需选取框并完成。 – rfmodulator 2012-02-23 06:51:27

0

两个选项,我能想到的:

  1. 当工作完成后,不要马上关闭它。相反,设置一个计时器将其关闭,并将进度设置为100%,并等待足够的时间以供用户查看。

  2. 回合的百分比增长,比如,5分,这样的进度条实际上显示 100%完成了95和100%之间的时间。