我有一个在线程X上构造的类Foobar
的实例。我有一个只能从线程X调用的函数StartWork()
。为了避免创建错误,我通过检查{强制执行此约束{1}}。该函数启动Debug.Assert(CreatorID == Environment.CurrentManagedThreadId)
的异步操作。我确保当工人通过挂钩BackgroundWorker
完成其操作时调用WorkCompleted()
。
出于线程安全的原因,应该在线程X上执行RunWorkerCompleted
,因为它会发送事件通知。如果这些通知是从错误的线程广播的,那么程序可能会遇到无法预料的线程安全问题,我猜想。
但是,在我的测试中,我注意到{I}没有像我预期的那样从线程X调用WorkCompleted()
。如何修复程序以防止出现这些事件可能引起的任何线程安全问题?我是否错误地接近了这个问题?我已经意识到我仍然需要使我的WorkCompleted()
处理程序是线程安全的。
答案 0 :(得分:0)
通过在UI线程上创建RunWorkerCompleted
的实例,我能够让Foobar
处理程序在同一个线程上运行。来自this answer的相关摘要:
如果从UI线程创建了
BackgroundWorker
,那么也会在UI线程上引发RunWorkerCompleted
事件。