我有一个方法Foo()
,可以创建并运行BackgroundWorker
在RunWorkerCompleted
内处理ProgressChanged
,Foo()
等。
我的主要话题是MyObject.Foo()
在调用MyObject.Foo()
主线程调用MyObject.DoSthWithFooData()
之后。
主线程对BackgroundWorker
内的MyObject.Foo()
一无所知。
如何强制主线程等到BackgroundWorker
完成其工作?
DoSthWithFooData()
中的BackgroundWorker
完成工作时,必须调用{p> MyObject.Foo()
。
答案 0 :(得分:5)
您不希望主线程等待BackgroundWorker。这会导致您的GUI无法响应 - 而不是良好的用户体验。首先使用BackgroundWorker的重点是避免阻塞主线程。相反,您应该为后台工作程序的RunWorkerCompleted
事件注册一个事件处理程序。事件处理程序中的代码将在后台任务完成时运行。
如果要在后台任务运行时阻止用户与程序交互,请执行以下操作:
RunWorkerCompleted
事件处理程序中重新启用它们。答案 1 :(得分:2)
将DoSthWithFooData
放入RunWorkerCompleted
事件
答案 2 :(得分:2)
您有两种选择:
BackgroundWorker
,只需同步执行代码即可。如果您要强制代码等待BackgroundWorker
完成,那么这基本上就是您正在做的事情。这不是最好的选择,假设下一个对你来说很实用。MyObject.Foo()
移动到RunWorkerCompleted
事件处理程序中。这是首选,因为它将维护工作的“背景”元素,并且UI将保持响应。答案 3 :(得分:0)
给Foo()一个参数callbacb在foo完成时调用的Action委托 然后你可以使用MenualResetEvent等待Foo完成。
当Action委托被称为信号ManualReset事件
时