编写报告进度的方法

hat*_*enn 6 c# multithreading progress progress-bar

我正在编写一个在库中执行某个操作的类.但是操作很繁琐,我希望能够找到该类中方法的进度,以便我可以在WinForms应用程序中使用它来报告进度.

我打算在我的WinForms应用程序中的另一个线程上运行我的类,我希望该类与WinForms应用程序的关注点分开,我不想将它绑定到除了它之外的任何特定内容.

在库类中实现进度报告机制的最佳方法是什么?

以某种方式在类中有一个进度变量,并在我的WinForms应用程序中添加一个事件监听器是不是一个好主意?如果是的话,我该怎么办呢?

编辑:我之前使用过BackgroundWorker该类,但我的问题是我不希望我的库类与任何多线程操作有关.所以我不想ReportProgress在库类中调用,我想(可能)在包含当前进度的类中有一个变量,我希望UI线程以某种方式"订阅"它.我不知道这是否是设计它的好方法.

Rob*_*Rob 4

查看BackgroundWorker类。它支持跨线程自动封送进度报告,并且它具有用于此类支持的非常简单的事件模型。

编辑:考虑到您直接使用BackgroundWorker的立场,您可能会做的是创建一个简单的包装器:

// Error checking elided for expository purposes.
public interface IProgressReporter 
{
    void ReportProgress(int progress, object status);
}

public class BackgroundWorkerProgressReporter : IProgressReporter
{
    private BackgroundWorker _worker;
    public BackgroundWorkerProgressReporter(BackgroundWorker worker)
    {
        _worker = worker;
    }

    public void ReportProgress(int progress, object status)
    {
        _worker.ReportProgress(progress, status);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,更改要报告进度的类的构造函数(或添加属性)以接受 IProgressReporter。这是依赖注入的一种形式,应该有意义地允许您的对象报告进度,同时还避免对线程库的特定依赖。