[英]How can I wait for BackgroundWorker?
我有一个方法Foo()
,它创建并运行BackgroundWorker
。
RunWorkerCompleted
, ProgressChanged
等在Foo()
中处理。
我的主线程调用MyObject.Foo()
。
在调用MyObject.Foo()
主线程调用MyObject.DoSthWithFooData()
。
主线程对MyObject.Foo()
的BackgroundWorker
一无所知。
如何强制主线程等到BackgroundWorker
完成其工作?
当MyObject.Foo()
的BackgroundWorker
完成其作业时,必须调用DoSthWithFooData()
。
您不希望主线程等待BackgroundWorker。 这会导致您的GUI无法响应 - 而不是良好的用户体验。 首先使用BackgroundWorker的重点是避免阻塞主线程。 相反,您应该为后台工作程序的RunWorkerCompleted
事件注册一个事件处理程序。 当后台任务完成时,将运行事件处理程序中的代码。
如果要在后台任务运行时阻止用户与程序交互,则:
RunWorkerCompleted
事件处理程序中重新启用它们。 将DoSthWithFooData
放入RunWorkerCompleted
事件中
你有两个选择:
BackgroundWorker
,只需同步执行代码即可。 如果您要强制代码等待BackgroundWorker
完成任务,那么这基本上就是您正在做的事情。 这不是最好的选择,假设下一个对你来说很实用。 MyObject.Foo()
到RunWorkerCompleted
事件处理程序中。 这是首选,因为它将维护工作的“背景”元素,并且UI将保持响应。 给Foo()一个参数callbacb在foo完成时调用的Action委托然后你可以使用MenualResetEvent等待Foo完成。
当Action委托被称为信号ManualReset事件时
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.