BackgroundWorker是否保证在后台线程上进行的内存更改对主线程可见?

时间:2014-11-14 18:00:18

标签: c# backgroundworker memory-visibility

如果我使用BackgroundWorker修改我的应用程序中的数据结构,是否可以保证在BackgroundWorker完成时(例如在RunWorkerCompleted事件处理程序中),后台线程所做的更改对主(UI)线程可见?对于奖励积分:如果是,那么保证这一点的机制是什么?

2 个答案:

答案 0 :(得分:3)

不,没有这样的保证。如果要从多个线程访问它,您需要自己同步对任何共享内存的访问。

当然,如果您使用BGW内置机制在线程之间传递数据,例如通过它存储的ResultProgress数据,那么它将正确地同步对该数据的访问。 / p>

答案 1 :(得分:2)

是的,只要您遵循BackgroundWorker合同,这不是您必须担心的事情。换句话说,使用提供的事件将数据引导到UI线程,ProgressChanged和RunWorkerCompleted。 .NET Framework源代码没有为此获得任何优雅点,同步不明确。这很常见,它依赖于许多地方的隐式同步。

但是有两个确保UI线程可以看到更新。首先是PostMessage(),一个winapi函数,用于表示需要查看调用队列的UI线程。 Used here,但是你根本看不到锁,它被埋在Windows里面。您可以看到的更容易识别的内容是在Winforms代码中清空调用队列。它在开始迭代该队列之前需要锁定。您可以看到it here,它是 threadCallbackList 成员的锁定。