使用 BackgroundWorker 时如何报告在 class 库中执行的工作的进度
How to report progress on work carried out in a class library when using BackgroundWorker
如何报告 class 库中对象中的 BackgroundWorker 执行的工作进度?
到目前为止,我还不确定如何使用 ReportProgress 来反馈信息(由于循环依赖,无法引用调用 class)。
这是发起工作的主要项目示例:
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!");
}
}
}
下面是 class 库中的上传方法示例:
namespace ClassLibrary {
public class HeavyWorkerClass {
public void StartWork() {
for (int i = 0; i <= 100; i++) {
Thread.Sleep(50);
}
}
}
}
HeavyWorkerClass
必须以某种方式报告其进度。否则你不应该知道任何关于进展的事情。
例如,它可以定期引发事件。然后视图模型可以订阅此事件并相应地更新其 Progress
属性。视图绑定到视图模型的 Progress 属性。
请注意,服务或 class 库方法很少报告其进度。这是因为在大多数情况下,根本没有 API 可以显示正在进行的操作的当前进度。在这种情况下,您不妨选择在 UI 中显示中间 ProgressBar
或类似的内容,直到操作完成:
<ProgressBar IsIndeterminate="True" />
根据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!");
}
}
}
做耗时工作的HeavyWorker类:
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);
}
}
}
}
如何报告 class 库中对象中的 BackgroundWorker 执行的工作进度?
到目前为止,我还不确定如何使用 ReportProgress 来反馈信息(由于循环依赖,无法引用调用 class)。
这是发起工作的主要项目示例:
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!");
}
}
}
下面是 class 库中的上传方法示例:
namespace ClassLibrary {
public class HeavyWorkerClass {
public void StartWork() {
for (int i = 0; i <= 100; i++) {
Thread.Sleep(50);
}
}
}
}
HeavyWorkerClass
必须以某种方式报告其进度。否则你不应该知道任何关于进展的事情。
例如,它可以定期引发事件。然后视图模型可以订阅此事件并相应地更新其 Progress
属性。视图绑定到视图模型的 Progress 属性。
请注意,服务或 class 库方法很少报告其进度。这是因为在大多数情况下,根本没有 API 可以显示正在进行的操作的当前进度。在这种情况下,您不妨选择在 UI 中显示中间 ProgressBar
或类似的内容,直到操作完成:
<ProgressBar IsIndeterminate="True" />
根据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!");
}
}
}
做耗时工作的HeavyWorker类:
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);
}
}
}
}