繁体   English   中英

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

[英]Does BackgroundWorker guarantee that memory changes made on the background thread become visible to the main thread?

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

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

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

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

但是有两个确保UI线程可以看到更新。 首先是PostMessage(),这是一个winapi函数,用于向UI线程发出信号,告知它需要查看调用队列。 在这里使用 ,但是您根本看不到该锁,它被埋在Windows内部。 可以更容易识别的代码位于清空调用队列的Winforms代码中。 在开始迭代该队列之前,需要先进行锁定。 您可以在这里看到 ,它是threadCallbackList成员的锁。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM