C# BackgroundWorker是否保证在后台线程上所做的内存更改对主线程可见?

C# BackgroundWorker是否保证在后台线程上所做的内存更改对主线程可见?,c#,backgroundworker,memory-visibility,C#,Backgroundworker,Memory Visibility,如果我使用BackgroundWorker修改应用程序中的数据结构,是否可以保证在BackgroundWorker完成时(例如在RunWorkerCompleted事件处理程序中),对后台线程所做的更改对主(UI)线程可见?奖励积分:如果是,什么机制可以保证这一点?不,没有这样的保证。如果要从多个线程访问任何共享内存,您需要自己同步对该内存的访问 当然,如果您使用BGW内置机制在线程之间传递数据,例如通过它存储的结果或进度数据,那么它将正确同步对该数据的访问。否,没有这样的保证。如果要从多个线程

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

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


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

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


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

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


但是有两种方法可以确保UI线程能够看到更新。首先是PostMessage(),这是一个winapi函数,用于向UI线程发出信号,表示它需要查看调用队列,然而,你根本看不到锁,它被埋在窗户里面。您可以看到的更容易识别的是在清空调用队列的Winforms代码中。它在开始迭代该队列之前需要一个锁。您可以看到,这是对threadCallbackList成员的锁定。

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

但是有两种方法可以确保UI线程能够看到更新。首先是PostMessage(),这是一个winapi函数,用于向UI线程发出信号,表示它需要查看调用队列,然而,你根本看不到锁,它被埋在窗户里面。您可以看到的更容易识别的是在清空调用队列的Winforms代码中。它在开始迭代该队列之前需要一个锁。您可以看到,它是threadCallbackList成员上的锁