等待背景工作者

时间:2013-01-29 12:43:18

标签: c# multithreading backgroundworker

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

代码

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

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

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

也许在F1中返回IAsyncResult并将其传递给f2中的worker,然后在f2 worker的开头调用AsyncWaitHandle上的waitone?

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

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

答案 2 :(得分:-1)

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