2011-09-27 72 views
1

我有一個程序執行24小時,然後重新啓動。在另一個應用程序域中執行代碼的C#代碼?

如何將main()從一個單獨的應用程序域中刪除並每24小時刷新一次,以便完全消除任何潛在的內存泄漏?

+0

那些是窗口服務? –

+0

可能重複:在另一個應用程序中訪問AppDomain? http://stackoverflow.com/questions/6529249/get-access-to-appdomain-in-another-app/6531610#6531610 –

回答

15

你讓我的權利,直到你說:

爲了徹底消除任何潛在的內存泄漏

如果您想在另一個應用程序域中運行代碼,那麼在如何執行此操作時會有大量資源,例如Executing Code in Another Application Domain (C# and Visual Basic)。基本原則是創建一個繼承自MarshalByRefObject的類。然後創建新的應用程序域,並指示它創建一個對象的實例 - 這個對象就是那麼你的「切入點」到你的應用程序域:

AppDomain newAppDomain = AppDomain.CreateDomain("NewApplicationDomain"); 
ProxyObject proxy = (ProxyObject)newAppDomain.CreateInstanceAndUnwrap("MyAssembly", "MyNamespace.MyProxy"); 

但是在C#中確實沒有任何這樣的事情作爲「內存泄漏」,充其量只是無意中保留了一些對象。如果是這種情況,那麼應用程序域只是矯枉過正 - 你真正需要做的就是刪除對不再需要的託管對象的引用,並且垃圾收集器將爲你整理它們。

如果您在非託管代碼中存在真正的內存泄漏,則應用程序域也不會對您有所幫助。非託管類型不受應用程序域限制,因此,在應用程序域被「銷燬」時,在應用程序域內分配的任何非託管內存都不會被釋放。在這種情況下,您最好使用單獨的進程。

+0

這是真實的和正確的。不過,我認爲OP期待着一個'AppDomain'在「關閉」(包括非託管資源)時得到清理 - 就像Windows在退出時爲其處理一樣。然而不幸的是,我沒有辦法(我知道)卸載一個加載的AppDomain。以編程方式將自己的應用程序域加載到內存中的一個主要缺點是它會引入內存泄漏。您加載的每個「AppDomain」都將在內存中,直到進程退出。 – BrainSlugs83

+3

@ BrainSlugs83 [AppDomain.Unload(newAppDomain)](http://msdn.microsoft.com/en-us/library/system.appdomain.unload%28v=vs.110%29.aspx)。這不如在單獨的進程中隔離你的代碼,但會釋放.Net GC分配的內存,最終確定對象等......最重要的是,卸載已加載到該應用程序域的程序集。 – Justin

+0

啊,我的不好,我把'AppDomains'與'Assemblies'混淆了(我知道這很荒謬!)。謝謝你在那裏糾正我。 - (對於其他人:[見Jason Zander的博客:「爲什麼沒有Assembly.Unload方法?」](http://blogs.msdn.com/b/jasonz/archive/2004/05/31/145105的.aspx)) – BrainSlugs83

-2

你不行。一個進程是獨立的和獨立的,你不能將一個線程從一個進程轉移到另一個進程中。

但是,如果您絕對不能在內部修復內存泄漏,您可以做的是創建一個看門狗程序,該程序在停止運行時啓動應用程序,並將您的應用程序設置爲僅在單一執行模式下運行。

相關問題