c#检测何时有太多对象

标签 c# memory-management garbage-collection

我有一个 c# 应用程序,用户可以在其中使用拖放操作使用 wpf TreeView 来处理一些业务。撤消堆栈提供了一些用户功能,可以从头开始回滚所有内容,并且大约限制为大约 500 步。

因此,如果这些对象引用在取消堆栈中,则不允许 GC 最终确定它们,因为用户可能需要它。

现在使用复制和粘贴,软件测试人员可以这样做并在彼此内部复制 2 个节点,例如重复此操作20 次,这意味着对象计数通过克隆从 2、4、8、16、32 增长到最终的 1048576。因此复制操作可能导致创建,例如1048576 个对象,因此撤消堆栈将存储 1048576 个对象引用,用于一个撤消步骤。 测试人员可以轻松创建此应用程序崩溃:

Exception of type 'System.OutOfMemoryException' was thrown.

所以限制Undo栈并不能解决对象过多的问题。

除了没有用例有这么多对象之外,我想只是为了安全起见。

msdn 告诉我:

Be sure you have enough memory for internal purposes and new managed objects.

在我的案例中,如何实现这一点,同时保持撤消功能?

最佳答案

最简单的方法是序列化您的对象并将其保存在磁盘上,以便在需要撤消时可以将它们加载回来。

这里的关键概念是序列化。您的对象应该是可序列化的才能执行此操作。需要时,您可以反序列化这些对象并加载到内存中。

关于c#检测何时有太多对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15680393/

相关文章:

python - 如何在多处理进程中保护日志记录对象免受垃圾收集器的影响?

ios - AIR for iOS垃圾回收

c# - 更新到 Azure Application Insights 1.1,现在不发送数据

C# SendKeys.发送

c# - 如何修改另一个窗口的背景颜色?

java - 为什么终结器有 "severe performance penalty"?

c - 在 C 中使用自由函数时内存在 block 中损坏

c# - 通过 ListView 进行 foreach 并访问子项?

c - C在重新分配后是否重用内存?

c# - 第三方库中麻烦的 GC.collect() 调用