如果我使用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線程來完成