有沒有一種方法可以跨AppDomains有效地共享或移動.NET對象?我意識到AppDomains的意圖是提供隔離 - 但是我有一種情況,我需要移動一個相對較大的緩存的不可變對象集合,這些對象的計算和創建都很昂貴。目前,我有一套可行的序列化方法,但速度很慢。在.NET中跨AppDomains移動對象
回答
你離不開其序列間移動一個AppDomain的對象。這是AppDomain的主要觀點 - 您幾乎可以將其視爲一個完全獨立的過程。
這是MarshallByRefObject用武之地。它允許您通過遠程處理從另一個AppDomain使用使用對象,而不必通過AppDomain邊界將其序列化。您仍然通過遠程處理工作,所以它會比將對象保留在同一個AppDomain中慢,但是如果對象很大並且很少使用它,與序列化和反序列化相比,這可以節省大量時間它在第二個AppDomain中創建一個新副本。
有一兩件事你可以嘗試是從MarshalByRefObject
派生的對象。默認情況下,對象按AppDomains按值進行編組。對於派生自MarshalByRefObject
的對象,調用者被賦予對象的代理。所有呼叫都通過代理,然後被編組到對象的應用程序域。這可以減少在兩個應用程序域中創建所有對象的副本的需求。
我相信,只有少數「福地」對象是能夠「元帥的流血」,即只是讓跨邊界漂移(字符串是一個)
遠程處理呼叫,如果他們是矮胖應該工作而不是試圖整個事情整個複製(大內存浪費,如果沒有別的)
如何創建用於管理共享對象的一個單獨的應用空間,然後使用或者Web服務或遠程獲取/共享數據集合?您將本質上創建一箇中央內存(取決於您如何存儲數據)存儲庫。
.NET Remoting是我知道的最好的方法,雖然我有相當的經驗有限。如果你想使用它,你需要閱讀Ingo Rammer的高級.NET Remoting,第二版和 Mario Szpuszta。當你開始使用Google Remoting時,Ingo的名字會頻繁彈出。我發現這本書現在有點過時了,但相當有價值。我還沒有嘗試過使用大型二進制序列化對象,但對於我一直在使用的較小對象似乎很有效。我發現你不能擁有SecureString屬性的對象,除非你想爲它們實現自定義的序列化/反序列化。
- 1. .NET System.OutOfMemoryException和AppDomains
- 2. 跨AppDomains和進程的TransactionScope
- 3. 跨域移動用戶對象
- 4. 在iPhone中移動對象?
- 5. 在nsmutablearray中移動對象
- 6. 在PYGAME中移動對象
- 7. 在libgdx中移動對象
- 8. 在Python中移動對象?
- 9. 移動時移動對象
- 10. 移動對象
- 11. 移動對象
- 12. 在Filemaker中動態移動UI對象
- 13. 如何在.NET中跨進程共享對象?
- 14. 跨線程與管理對象在.net中的權限
- 15. 在隨機移動中來回移動動畫對象
- 16. .NET AppDomains可以這樣做嗎?
- 17. PhysicsJS - 移動對象
- 18. Java對象移動
- 19. REST對象爲半動態.net對象
- 20. 在部分陣列中移動對象
- 21. 在OpenGL ES for iOS中移動對象?
- 22. 在ViewportControl WP8中移動對象
- 23. 在多維數組中移動對象
- 24. 在HTML Canvas中移動旋轉對象
- 25. 如何在Goblin XNA中移動對象?
- 26. 對象在模擬中的移動
- 27. 對象在加速度計中移動
- 28. 在Mathematica中使用Manipulate移動對象
- 29. iOS:在NSMutableArray中移動對象
- 30. as3 - 玩家在對象中移動