c#检测对象太多时

时间:2013-03-28 11:16:52

标签: c# memory-management garbage-collection

我有一个c#app,用户通过使用拖放操作使用wpf树视图来完成一些业务。 Undo堆栈提供了一些用户功能,可以从一开始就回滚所有内容,并且约有约500步。

因此,如果这些对象引用在undostack中,则不允许GC完成它们,因为用户可能需要它。

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

  

抛出了类型'System.OutOfMemoryException'的异常。

因此限制撤销堆栈并不能解决太多对象的问题。

除此之外没有用过这么多物品的用例,我想简单安全一点。

msdn告诉我:

  

确保您有足够的内存用于内部目的和新托管   对象。

如何在我的情况下实现这一点,保持撤销功能?

3 个答案:

答案 0 :(得分:1)

我建议你不要玩GC。我会考虑更改您的业务逻辑(可能是限制副本?)。此外,您可以在磁盘上的某处存储(保留)撤消步骤,abd允许它们从内存中消失。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

为了选项,您可以考虑使用MemoryFailPoint来更容易捕获异常。 OutOfMemory异常比其他expcetions更难处理,你可以使用MemoryFailPoint类减少获得OOM异常的机会。

话虽如此,最好将序列化撤消堆栈,或改变业务逻辑以避免无限制地复制/粘贴,如其他答案中所述。