2012-03-30 64 views
2

我正在使用需要很長時間啓動和初始化的開放源代碼.NET應用程序。它創建了數千個對象並將它們配置爲首次使用。我試圖改善這個啓動時間。記錄和恢復應用程序狀態以快速啓動.NET應用程序

有沒有一種方法可以使用Windows API或類似方法捕獲應用程序內存,然後在重新啓動PC後稍後「快速」恢復此狀態?從本質上講,有一種方法可以訪問和保存.NET應用程序的底層內存,並讓CLR在以後「吸收」這些內存?

  • 最簡單的方法是使用Windows Hibernate創建「hiberfile.sys」,然後保存該文件的副本(如果可能的話)。每次啓動Windows時,都會使用保存的「乾淨」版本覆蓋現有的hiberfile,以便下次啓動。這確保您可以保存/恢復應用程序狀態,而無需處理內存,指針和句柄。這可以工作嗎?

  • 一種方法是創建一個磁盤,但我不知道是否可以恢復。 (虛擬內存,實際上關閉硬盤,允許內存保存/恢復爲一個簡單的文件)

  • 問題,但有點不同,因爲我不介意重新插入應用程序內存在它保存的確切地址。PC完全在我手中,爲簡單起見,假設沒有其他應用程序正在運行。

  • C#不支持continuation開箱即用,雖然.NET 3.0和更高版本中的Workflow Foundation允許停止和重新啓動工作流程。我想知道應用程序如何表現爲一個工作流程。

  • 雷蒙德陳反駁了這一場blog post,但沒有太大的技術數據在這裏無論是。

  • YAPM,開源進程監視器能夠「顯示/釋放/更改保護/取消進程的虛擬內存空間中的內存區域」。這可能與我之後的事情類似嗎?

+1

我認爲你可以做的最好的是二進制序列化和反序列化 – 2012-03-30 14:40:10

+0

Raymond Chen的文章確實給出了技術數據,其中包括一些非常重要的例子(系統的其餘部分沒有休眠,可能使所有外部句柄和資源無效)。 – ssube 2012-03-30 14:55:10

回答

2

如果你想要一個不變的保存/加載過程中避免首次使用,你可以看看serialization

實際上保存內存是可能的,但是當您嘗試恢復內存時遇到問題,並且您有可能沒有足夠的內存,可能沒有相同大小的空閒塊,或者等等。

序列化的目標水平,甚至一大羣的對象,將讓你在幾乎相同的方式他們和他們的狀態保存到內存轉儲,但大大簡化加載過程,並使其更加可靠。 .NET提供了相當不錯的序列化支持,並可以輸出到二進制文件(小,但依賴於版本)或XML(大,人類可讀的,一定程度上更靈活)。其他圖書館可能會提供不同的使用(我相信這是一個JSON一個,這是稍微詳細然而,但隨着Web應用程序的工作)的多個方法。

根據您的應用程序是如何工作的,你可能希望/能在第一次運行創建了第一個使用模型,它們序列化到磁盤,並從此加載它們。一段時間的努力,也應該可以將所有對象(不同類型的)添加到一個單一的收集和序列化,使所有的數據被存儲在一個文件中。

所以,這是可能的,可能確實會更快,雖然不是你最初的想法。

+0

如果內存被重新插入到它被解除的確切地址,該怎麼辦?像Windows休眠/恢復?整個PC都在我的控制之下。 – 2012-03-30 14:45:20

+0

保證這一點即使不是不可能,也是非常困難的。 Hibernate在內核級別工作,所以除非你可以強制內核不要在該塊內分配任何內存,否則加載存儲的數據,然後將其映射到進程虛擬內存映射中的特定地址,這種情況不會發生。大多數或所有這些在.Net中都是不可能的,甚至可能不直接與WinAPI一起工作。在.Net世界中,序列化絕對是一種更正確的方法,並且可能會在以後節省很多頭痛(更簡單,更安全)。 – ssube 2012-03-30 14:49:06

+0

用冬眠的想法更新了我的問題。這可以工作嗎? – 2012-03-30 15:06:54