1

Foobar我有一个在线程 X 上构造的类的实例。我有一个StartWork()只能从线程 X 调用的函数。为了避免创建错误,我通过检查来强制执行此约束Debug.Assert(CreatorID == Environment.CurrentManagedThreadId)。该函数启动 a 的异步操作BackgroundWorker。我已经确保WorkCompleted()当工作人员通过挂钩完成其操作时调用它RunWorkerCompleted

出于线程安全的原因WorkCompleted(),应该在线程 X 上执行,因为它会发出事件通知。如果这些通知是从错误的线程广播的,我想程序可能会遇到无法预料的线程安全问题。

但是,在我的测试中,我注意到它WorkCompleted()并没有像我预期的那样从线程 X 调用。如何修复我的程序以防止引发这些事件可能引起的任何线程安全问题?我是否错误地解决了这个问题?我已经意识到我仍然需要使我的BackgroundWorker.DoWork处理程序线程安全。

4

1 回答 1

0

通过在 UI 线程上创建实例,我能够让RunWorkerCompleted处理程序在同一线程上运行。此答案Foobar的相关片段:

如果BackgroundWorker是从 UI 线程创建的,则该RunWorkerCompleted事件也将在 UI 线程上引发。

于 2012-10-21T13:20:35.897 回答