我已经构建了一个C#Winforms应用程序,用作运行一组计算和内存密集型任务的模拟。我正在使用后台工作人员来完成工作,因此UI可以保持响应。我只有一个for循环:
os.listdir(os.getcwd())
我想要的是在后台顺序运行这些,但我无法弄清楚后台工作者是否会这样做,或者我是否需要使用任务。我还没有找到一个很好的例子来解释一个任务如何实现我的目标。任何帮助将不胜感激。
答案 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)
根据你的描述,听起来你真的不需要多个后台工作者,只需使用一个后台工作程序并在其中运行循环。