按顺序运行后台工作

时间:2016-06-19 20:50:49

标签: c# winforms

我已经构建了一个C#Winforms应用程序,用作运行一组计算和内存密集型任务的模拟。我正在使用后台工作人员来完成工作,因此UI可以保持响应。我只有一个for循环:

os.listdir(os.getcwd())

我想要的是在后台顺序运行这些,但我无法弄清楚后台工作者是否会这样做,或者我是否需要使用任务。我还没有找到一个很好的例子来解释一个任务如何实现我的目标。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:0)

如果您需要按顺序运行模拟,那么您可以订阅后台工作人员RunWorkerCompleted事件以启动下一个模拟。

所以你刚开始第一个工人:

var worker1 = new BackgroundWorker();
worker1.RunWorkerCompleted += backgroundWorker1_RunWorkerCompleted;
worker1.RunWorkerAsync();

然后在处理程序中:

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    var worker2 = new BackgroundWorker();
    worker2.RunWorkerCompleted += backgroundWorker2_RunWorkerCompleted;
    worker2.RunWorkerAsync();
}

显然,你可以使用一个数组来保存对每个worker的引用,并有一个类变量来保存哪个是活动的。然后,您只需要一个处理程序来增加模拟计数并启动列表中的下一个。

答案 1 :(得分:0)

您可以使用DoWork方法中的BackgroundWorker.ReportProgress Method将信息传回主线程。您可以使用循环变量在DoWork方法和每个循环调用worker.ReportProgress(i);中执行循环。该值不由后台工作程序解释,因此它不必是百分比值。然后在ProgressChanged事件处理程序中,您可以调用ResetSim();。 (我假设ResetSim在UI中起作用,因此必须在UI线程上执行。)

答案 2 :(得分:0)

根据你的描述,听起来你真的不需要多个后台工作者,只需使用一个后台工作程序并在其中运行循环。