正在等待后台工作人员

本文关键字:工作人员 后台 在等待 | 更新日期: 2023-09-27 17:56:42

我有两个方法可以使用BackgrounderWorker完成一些工作。如果我运行第一种方法,那么它会在后台完成一些工作,第二种方法也是如此。但我想要的是第二种方法应该等到方法一个工作线程启动。

法典

private void Method1(object sender, RoutedEventArgs e)
{
    RunFirstWorker();
}
private void Method2(object sender, RoutedEventArgs e)
{
    RunFirstWorker();
    RunSecondWorker();
}

正在等待后台工作人员

> 您可以使用事件对象(ManualResetEventAutoResetEvent)来同步这些函数的执行。创建处于非信号状态的事件,并在RunSecondWorker()DoWork 事件处理程序开始时等待它。将此事件的状态设置为在 RunFirstWorker()DoWork 事件处理程序结束时发出信号。

在您的原始代码片段中,Method1()Method2()是 GUI 回调(在 GUI 线程上执行的方法),因此您不想阻止它们(您不想在任何这些方法本身中等待事件,而是在 BackgroundWorker 回调 - DoWork事件处理程序中)。

也许在

F1 中返回 IAsyncResult 并将其传递给 f2 中的工作线程,然后在 f2 工作线程开始时在 AsyncWaitHandle 上调用 waitone?

请参阅 http://msdn.microsoft.com/en-us/library/system.iasyncresult.aspx

@Nikita - 我的意思不是来自 F1 和 F2 内部的电话,原始海报说他们正在使用后台工作人员。

编辑:(查看其他答案)好的 - 问题是您将如何以及何时等待 F1。BackgroundWorker 具有事件 - RunWorkerComplete,该事件正在主线程上执行。如果你需要在那里做一些逻辑并等待它完成 - 那么你不能等待,这将导致死锁。一种选择是使用 Application.DoEvents() 来增加 msg - 但它可能会导致一些意外行为。