从分层工人阶层获取进度报告?

时间:2010-04-15 20:10:56

标签: c# multithreading class progress

我有一个分层的工人类,我正试图从中获取进度报告。我看起来像这样:

public class Form1
{
    private void Start_Click()
    {
        Controller controller = new Controller();

        controller.RunProcess();
    }
}

public class Controller
{
    public void RunProcess()
    {
        Thread newThread = new Thread(new ThreadStart(DoEverything));
        newThread.Start();
    }

    private void DoEverything()
    {
        // Commencing operation...
        Class1 class1 = new Class1();

        class1.DoStuff();

        Class2 class2 = new Class2();

        class2.DoMoreStuff();
    }

}

public class Class1
{
    public void DoStuff()
    {
        // Doing stuff
        Thread.Sleep(1000);

        // Want to report progress here
    }
}

public class Class2
{
    public void DoMoreStuff()
    {
        // Doing more stuff
        Thread.Sleep(2000);

        // Want to report progress here as well
    }
}

之前我使用过BackgroundWorker类,但我觉得我需要一些更自由的形式来做这样的事情。我想我可以使用委托/事件解决方案,但我不知道如何在这里应用它。假设我在Form1上有一些标签或类似内容,我希望能够使用class1和class2的进度进行更新,这是最好的方法吗?

3 个答案:

答案 0 :(得分:1)

使用事件是最直接的解决方案。当您从主线程订阅该事件时,处理程序应检查Control.IsInvokeRequired以了解它是否必须通过Invoke(...)再次调用自身以将消息传递给正确的线程。

答案 1 :(得分:1)

约翰是对的。您想要利用事件,因此您需要使用委托或代表。这可能会给你一些想法。

http://www.yoda.arachsys.com/csharp/threads/winforms.shtml

答案 2 :(得分:0)

如果您不希望在通知期间阻止处理线程,则可以使用Control.BeginInvoke()进行防火&忘记行为。

要减少调用次数并更新常规间隔的进度,您可能希望在类中封装不同操作的状态。
通过这种方式,您可以将状态写入例如volatile字段 - 可能是另一个聚合状态类 - 并在GUI线程上使用一个计时器来重新读取状态并相应地刷新标签。