繁体   English   中英

我该如何等待BackgroundWorker?

[英]How can I wait for BackgroundWorker?

我有一个方法Foo() ,它创建并运行BackgroundWorker
RunWorkerCompletedProgressChanged等在Foo()中处理。

我的主线程调用MyObject.Foo()
在调用MyObject.Foo()主线程调用MyObject.DoSthWithFooData()

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

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

MyObject.Foo()BackgroundWorker完成其作业时,必须调用DoSthWithFooData()

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

如果要在后台任务运行时阻止用户与程序交互,则:

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

DoSthWithFooData放入RunWorkerCompleted事件中

你有两个选择:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM