使用 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);
            }
        }
    }
}