【发布时间】:2022-07-06 17:20:15
【问题描述】:
我最初的问题是关于 UI 阻塞,我有两个外部进程应该与其他一些代码连续执行,每个进程都会执行n times,这些进程的两个执行导致 UI 冻结,
为了避免这个问题,我在代码中实现了 backgroundworker 对象,第一个进程 ProcessA 将在 backgroundworker 中,第二个 ProcessB 将在 backgroundworker 中。
让我们从 ProcessA 开始,当我运行我的应用程序并开始执行整个任务时,ProcessA 会运行得如此之快并输出结果(我不知道为什么它运行得很快),对于结果,它们似乎是正确的。
ProcessA执行了n个步骤,每一步都会创建一个新的BackgroundWorker来做这个工作并在后台执行任务。
第二个进程必须在第一个进程完成后执行,我现在的问题是第一个进程的 CompletedTask 事件不会执行,第二个进程在第一个进程完成之前启动。
public void ButtonClick(object sender, RoutedEventArgs e)
{
for (int i = 0; i < steps + 1; i++)
{
backgroundworker = new BackgroundWorker();
backgroundworker.DoWork += new DoWorkEventHandler(BackgroundWorker_DoWork);
backgroundworker.RunWorkerCompleted += BackgroundWorker_RunWorkerCompleted;
backgroundworker.RunWorkerAsync(Tuple.Create(mypath, i));
}
While(!FirstProcessFinished)
Thread.Sleep(1000);
RunSecondProcess(mypath);
}
protected void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
// Some code to run first Process
}
protected void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Counter++;
IncrementProgressBar();
Thread.Sleep();
Console.WriteLine("Finished");
if (counter == Steps + 1)
{
FirstProcessFinished = true;
}
}
如何在调用 n 次 backgroundWorker_Completed 后正确执行 ProcessB?
【问题讨论】:
-
我使用的是
Backgroundworker而不是 Task 和async方法。 -
async / await和Task将使您的生活更轻松。Backgroundworker是强制性的吗? -
BackgroundWorker 已过时。参见例如Async/await vs BackgroundWorker.
标签: c# wpf multithreading backgroundworker