0

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

代码

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

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

3 回答 3

2

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

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

于 2013-01-29T12:58:23.320 回答
0

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

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

@Nikita - 我不是说从 F1 和 F2 内部打电话,原海报说他们正在使用后台工作人员。

于 2013-01-29T12:45:39.753 回答
-1

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

于 2013-01-29T12:47:59.783 回答