如果我使用 BackgroundWorker 修改应用程序中的数据结构,是否可以保证在 BackgroundWorker 完成时(例如在 RunWorkerCompleted 事件处理程序中)对主 (UI) 线程可见对后台线程所做的更改?对于奖励积分:如果是这样,保证这一点的机制是什么?
问问题
139 次
2 回答
3
不,没有这样的保证。如果您想从多个线程访问它,您需要自己同步对任何共享内存的访问。
当然,如果您使用 BGW 内置机制在线程之间传递数据,例如通过它存储的Result
数据Progress
,那么它将正确同步对该数据的访问。
于 2014-11-14T18:03:27.550 回答
2
是的,只要遵守 BackgroundWorker 合同,这不是您必须担心的事情。换句话说,使用提供的事件将数据传输到 UI 线程 ProgressChanged 和 RunWorkerCompleted。.NET Framework 源代码没有为此评分任何优雅点,同步不是明确的。这很常见,它在很多地方都依赖于隐式同步。
但是有两个可以确保 UI 线程可以看到更新。首先是 PostMessage(),这是一个 winapi 函数,用于通知 UI 线程它需要查看调用队列。 在这里使用,但是你根本看不到锁,它被埋在 Windows 里面。您可以看到的更容易识别的是在清空调用队列的 Winforms 代码中。它在开始迭代该队列之前需要一个锁。你可以在这里看到它,它是threadCallbackList成员上的锁。
于 2014-11-14T18:35:40.927 回答