我该如何等待BackgroundWorker?

时间:2011-03-15 16:53:48

标签: c# synchronization backgroundworker

我有一个方法Foo(),可以创建并运行BackgroundWorkerRunWorkerCompleted内处理ProgressChangedFoo()等。

我的主要话题是MyObject.Foo() 在调用MyObject.Foo()主线程调用MyObject.DoSthWithFooData()之后。

主线程对BackgroundWorker内的MyObject.Foo()一无所知。

如何强制主线程等到BackgroundWorker完成其工作?

DoSthWithFooData()中的BackgroundWorker完成工作时,必须调用{p> MyObject.Foo()

4 个答案:

答案 0 :(得分:5)

您不希望主线程等待BackgroundWorker。这会导致您的GUI无法响应 - 而不是良好的用户体验。首先使用BackgroundWorker的重点是避免阻塞主线程。相反,您应该为后台工作程序的RunWorkerCompleted事件注册一个事件处理程序。事件处理程序中的代码将在后台任务完成时运行。

如果要在后台任务运行时阻止用户与程序交互,请执行以下操作:

  • 启动BackgroundWorker时禁用相关控件。
  • RunWorkerCompleted事件处理程序中重新启用它们。

答案 1 :(得分:2)

DoSthWithFooData放入RunWorkerCompleted事件

答案 2 :(得分:2)

您有两种选择:

  1. 您可以完全删除BackgroundWorker,只需同步执行代码即可。如果您要强制代码等待BackgroundWorker完成,那么这基本上就是您正在做的事情。这不是最好的选择,假设下一个对你来说很实用。
  2. 将通常跟随调用的逻辑MyObject.Foo()移动到RunWorkerCompleted事件处理程序中。这是首选,因为它将维护工作的“背景”元素,并且UI将保持响应。

答案 3 :(得分:0)

给Foo()一个参数callbacb在foo完成时调用的Action委托 然后你可以使用MenualResetEvent等待Foo完成。

当Action委托被称为信号ManualReset事件