我有一个分层的工人类,我正试图从中获取进度报告。我看起来像这样:
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的进度进行更新,这是最好的方法吗?
答案 0 :(得分:1)
使用事件是最直接的解决方案。当您从主线程订阅该事件时,处理程序应检查Control.IsInvokeRequired
以了解它是否必须通过Invoke(...)
再次调用自身以将消息传递给正确的线程。
答案 1 :(得分:1)
约翰是对的。您想要利用事件,因此您需要使用委托或代表。这可能会给你一些想法。
答案 2 :(得分:0)
如果您不希望在通知期间阻止处理线程,则可以使用Control.BeginInvoke()
进行防火&忘记行为。
要减少调用次数并更新常规间隔的进度,您可能希望在类中封装不同操作的状态。
通过这种方式,您可以将状态写入例如volatile字段 - 可能是另一个聚合状态类 - 并在GUI线程上使用一个计时器来重新读取状态并相应地刷新标签。