2017-04-06 53 views
-2

如何报告BackgroundWorker在类库中的对象中执行的工作进度?如何在使用BackgroundWorker时报告在类库中进行的工作进度

我到目前为止还不确定如何使用ReportProgress来反馈信息(由于循环依赖性,无法引用调用类)。

这是启动工作的主要项目的例子:

namespace MainProject { 
    class MainWindowVM : INotifyPropertyChanged { 
     private BackgroundWorker _counterWorker; 

     public event PropertyChangedEventHandler PropertyChanged; 

     private void NotifyPropertyChanged([CallerMemberName] string propertyName = "") { 
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
     } 

     private int _progress; 
     public int Progress { 
      get { return _progress; } 
      set { _progress = value; NotifyPropertyChanged(); } 
     } 

     public MainWindowVM() { 
      var heavyWorker = new ClassLibrary.HeavyWorkerClass(); 
      _counterWorker = new BackgroundWorker(); 
      _counterWorker.DoWork += new DoWorkEventHandler(_counterWorker_DoWork); 
      _counterWorker.RunWorkerAsync(heavyWorker); 

     } 

     private void _counterWorker_DoWork(object sender, DoWorkEventArgs e) { 
      var heavyWorker = (ClassLibrary.HeavyWorkerClass)e.Argument; 
      heavyWorker.StartWork(); 
      Progress = 100; 
      System.Windows.MessageBox.Show("Work completed!"); 
     } 
    } 
} 

下面是在类库上传方法的一个例子:

namespace ClassLibrary { 
    public class HeavyWorkerClass { 
     public void StartWork() { 
      for (int i = 0; i <= 100; i++) { 
       Thread.Sleep(50); 
      } 
     } 
    } 
} 
+1

去看一下'ReportProgress'方法? [有](https://www.codeproject.com/Articles/99143/BackgroundWorker-Class-Sample-for-Beginners)是这个 – lena

+2

许多教程之一没有一个很好的[mcve],清楚地说明你遇到的任何问题有,不可能知道你需要什么答案(发布答案的任何人只是猜测,并没有真正的业务这样做)。如果你编写你的WPF程序“正常”,那么你有视图模型,实现INotifyPropertyChanged绑定到UI对象,你可以根据需要设置视图模型属性值。 WPF将为你处理所有的交叉线程内容。如果你不是以正常的方式编写WPF,那么它会变得更加复杂,但是如果没有MCVE,精确的细节会有所不同。 –

+0

[更新GUI使用BackgroundWorker]的可能重复(http://stackoverflow.com/questions/5192169/update-gui-using-backgroundworker) –

回答

1

HeavyWorkerClass必须报告其进度不知何故。不管怎样,你都不应该对进展有所了解。

它可以例如定期举办一个活动。然后,视图模型可以订阅此事件并相应地更新其Progress属性。视图绑定到视图模型的Progress属性。

请注意,服务或类库方法尽管报告其进度是非常罕见的。这是因为在大多数情况下,根本没有API可以揭示飞行中操作的当前进度。在这样的情况下,您不妨选择,直到操作完成,显示中间ProgressBar或在UI类似:

<ProgressBar IsIndeterminate="True" /> 
+0

啊,当然!我可以将Progress属性移动到HeavyWorkerClass中,并让它实现INotifyPropertyChanged。如果我还为MainWindowVM中的HeavyWorkerClass对象添加public get属性,View可以直接绑定到HeavyWorkerClass内的Progress属性。非常感谢小费! – Oystein

+0

另一方面,我不想使用IsIndeterminate,因为(1)流程运行时间长短不一,(2)流程不确定。 – Oystein

0

mm8的解决方案,下面是更新的代码。

主要项目启动工作:

namespace MainProject { 
    class MainWindowVM : INotifyPropertyChanged { 
     private BackgroundWorker _counterWorker; 

     public event PropertyChangedEventHandler PropertyChanged; 

     private void NotifyPropertyChanged([CallerMemberName] string propertyName = "") { 
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
     } 

     private ClassLibrary.HeavyWorkerClass _heavyWorker; 
     public ClassLibrary.HeavyWorkerClass HeavyWorker { 
      get { return _heavyWorker; } 
     } 

     public MainWindowVM() { 
      _heavyWorker = new ClassLibrary.HeavyWorkerClass(); 
      _counterWorker = new BackgroundWorker(); 
      _counterWorker.DoWork += new DoWorkEventHandler(_counterWorker_DoWork); 
      _counterWorker.RunWorkerAsync(_heavyWorker); 
     } 

     private void _counterWorker_DoWork(object sender, DoWorkEventArgs e) { 
      var heavyWorker = (ClassLibrary.HeavyWorkerClass)e.Argument; 
      heavyWorker.StartWork(); 
      System.Windows.MessageBox.Show("Work completed!"); 
     } 
    } 
} 

HeavyWorkerClass,它的耗时的工作:

namespace ClassLibrary { 
    public class HeavyWorkerClass : INotifyPropertyChanged { 

     private int _progress; 
     public int Progress { 
      get { return _progress; } 
      set { 
       _progress = value; 
       NotifyPropertyChanged(); 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     private void NotifyPropertyChanged([CallerMemberName] string propertyName = "") { 
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
     } 

     public void StartWork() { 
      for (int i = 0; i <= 100; i++) { 
       Progress = i; 
       Thread.Sleep(50); 
      } 
     } 
    } 
} 
相关问题