如果我使用BackgroundWorker修改我的应用程序中的数据结构,是否可以保证在BackgroundWorker完成时(例如,在RunWorkerCompleted事件处理程序中)后台线程所做的更改对主(UI)线程是可见的?对于奖励积分:如果是这样,那么保证这一点的机制是什么?BackgroundWorker确保后台线程上的内存更改对主线程可见吗?
0
A
回答
3
不,没有这样的保证。如果你想从多个线程访问它,你需要自己同步访问任何共享内存。
当然,如果您使用BGW内置的线程之间传递数据的机制,比如通过它存储的Result
或Progress
数据,那么它将正确地同步访问该数据。
2
是的,只要您遵循BackgroundWorker合同,这不是您必须担心的事情。换句话说,使用提供的事件将数据传递给UI线程ProgressChanged和RunWorkerCompleted。 .NET Framework源代码没有为此评分任何优雅点,但同步并不明确。这很常见,它依赖于许多地方的隐式同步。
但有两个确保UI线程可以看到更新。首先是PostMessage(),它是一个winapi函数,用于发信号通知UI线程需要查看调用队列。 Used here,但是你根本看不到锁,它被埋在了Windows的内部。 可以更容易识别的看到的内容是在清空调用队列的Winforms代码中。它在开始迭代该队列之前需要一个锁。你可以看到it here,它是threadCallbackList成员上的锁。
相关问题
- 1. iOS保存主线程NSManagedObjectContext在后台更改
- 2. 主线程是前台线程还是后台线程?
- 3. ConcurrentHashMap更改对所有线程都可见吗?
- 4. 主线程正在等待更新接口的后台线程
- 5. iOS:如何在主线程中更新UI的后台线程?
- 6. UITableViewCell内的后台线程
- 7. 使用主线和后台线程
- 8. 在后台线程上查找backgroundTimeRemaining在后台线程上
- 9. XamlReader.Load在后台线程。可能吗?
- 10. Android View对象管理后台线程常见吗?
- 11. 在后台线程中调用Web服务并更新主线程上的UI
- 12. 是线程终止后在线程中分配的内存吗?
- 13. WPF确保RenderTargetBitmap已更新后台线程更改的绑定值
- 14. 线程与Backgroundworker
- 15. UIProgressView更新后台线程
- 16. 前台线程VS后台线程
- 17. 后台线程
- 18. 后台线程
- 19. TextWriterTraceListener在后台线程上
- 20. iOS线程和在主线程上进行UI更改
- 21. UI线程与BackgroundWorker的线程
- 22. 在后台线程上创建视图,在主线程中添加主视图
- 23. BackgroundWorker和主线程之间的沟通
- 24. 如何启动不阻塞Java主线程的后台线程?
- 25. 线程保持在内存
- 26. 在主线或后台线程上解析iOS XML
- 27. VB.NET WinForms - 如何从BackgroundWorker的线程访问主线程的对象?
- 28. 后台线程和连接将使线程为前台线程
- 29. 如何在跨线程传递数据时确保Java内存可见性
- 30. 主线程等待多个backgroundworker线程来完成