c# - 记录和恢复应用程序状态以快速启动 .NET 应用程序

标签 c# .net windows winapi memory

我正在使用一个需要很长时间才能启动和初始化的开源 .NET 应用程序。它创建了数千个对象并将它们配置为首次使用。我正在尝试改进此启动时间。

有没有办法使用 Windows API 或类似工具捕获应用程序内存,然后在重启 PC 后快速“恢复”此状态?本质上是否有一种方法可以访问和保存 .NET 应用程序的底层内存并让 CLR 在以后“吸收”该内存?

  • 最简单的方法是使用 Windows Hibernate 创建“hiberfile.sys”,然后保存此文件的副本(如果可能的话)。每次 Windows 启动时,您都会用保存的“干净”版本覆盖现有的休眠文件,以供下次启动。这确保您可以保存/恢复应用程序状态,而无需处理内存、指针和句柄。这行得通吗?

  • 一种方法是创建存储盘,但我不知道是否可以恢复。 (实际上脱离 HDD 工作的虚拟内存,允许将内存保存/恢复为一个简单的文件)

  • 类似于this问题,但有点不同,因为我不介意将应用程序内存重新插入到它保存的确切地址。PC 完全在我手中,为了简单起见,假设没有其他应用程序在运行。

  • C# 不支持 continuation开箱即用,尽管 .NET 3.0 和更高版本中的 Workflow Foundation 允许停止和重新启动工作流。我想知道应用程序如何作为工作流运行。

  • Raymond Chen 在 blog post 中对此提出异议。 ,但这里也没有太多技术数据。

  • YAPM ,开源进程监视器能够“显示/释放/更改保护/取消提交进程虚​​拟内存空间中的内存区域”。这可能与我所追求的类似吗?

最佳答案

如果您想要一个不变的保存/加载过程以避免首次使用,您可以查看serialization .

实际上节省内存是可能的,但是当您尝试恢复它时会遇到解决问题,并且您可能没有足够的内存,可能没有相同大小的空闲 block ,等等上。

对象级甚至一大组对象的序列化将允许您以几乎与转储内存相同的方式保存它们及其状态,但大大简化了加载过程并使其更加可靠。 .Net 提供了很好的序列化支持,并且可以输出到二进制文件(小但版本相关)或 XML(更大,人类可读,更灵活)。其他库可能会提供更多不同用途的方法(我相信有一个 JSON 库,它稍微更冗长,但适用于 Web 应用程序)。

根据您的应用程序的工作方式,您可能希望/能够在第一次运行时创建首次使用的模型,将它们序列化到磁盘,并从那时起加载它们。通过一些工作,还应该可以将所有对象(不同类型)添加到一个集合中并对其进行序列化,从而允许将所有数据存储在一个文件中。

所以是的,这是可能的,而且可能确实更快,尽管不是您最初的想法。

关于c# - 记录和恢复应用程序状态以快速启动 .NET 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9945106/

相关文章:

php - Composer 隐藏 token

c# - 新的 C# await 功能有什么作用?

c# - 开发人员如何使用源代码控制,我试图找到在小型开发环境中进行源代码控制的最有效方法

c# - webBrowser 控件在 Ajax 网页更新后或在框架中找不到 htmlElement

c# - 如何排除 Sonar 路径中带空格的文件?

c# - WPF AlternateContent 不工作

c# - Windows凭据提供程序实现

mysql - 有没有办法将 DB 用户密码传递到命令行工具 mysqladmin 中?

c# - 如何加速 C#/Linq 查询? [我不需要获取数据,我需要获取条件]

c# - 连接对象数组中的唯一字符串