我有一个c#app,用户通过使用拖放操作使用wpf树视图来完成一些业务。 Undo堆栈提供了一些用户功能,可以从一开始就回滚所有内容,并且约有约500步。
因此,如果这些对象引用在undostack中,则不允许GC完成它们,因为用户可能需要它。
现在使用复制和粘贴,软件测试人员可以这样做并将2个节点复制到彼此内部,重复此操作,例如20次,这意味着对象计数通过从2,4,8,16,32克隆到最终1048576而增长。因此,复制操作可能导致例如1048576更多对象,因此Undo堆栈将存储1048576个对象引用,用于ONE Undo步骤。 测试人员可以轻松地创建此应用程序崩溃:
抛出了类型'System.OutOfMemoryException'的异常。
因此限制撤销堆栈并不能解决太多对象的问题。
除此之外没有用过这么多物品的用例,我想简单安全一点。
msdn告诉我:
确保您有足够的内存用于内部目的和新托管 对象。
如何在我的情况下实现这一点,保持撤销功能?
答案 0 :(得分:1)
我建议你不要玩GC。我会考虑更改您的业务逻辑(可能是限制副本?)。此外,您可以在磁盘上的某处存储(保留)撤消步骤,abd允许它们从内存中消失。
答案 1 :(得分:1)
最简单的方法是序列化您的对象并将其保存在磁盘上,以便在需要撤消时可以将其加载回来。
这里的关键概念是序列化。您的对象应该是可序列化的以执行此操作。在需要时,您可以反序列化这些对象并加载到内存中。
答案 2 :(得分:1)
为了选项,您可以考虑使用MemoryFailPoint来更容易捕获异常。 OutOfMemory异常比其他expcetions更难处理,你可以使用MemoryFailPoint
类减少获得OOM异常的机会。
话虽如此,最好将序列化撤消堆栈,或改变业务逻辑以避免无限制地复制/粘贴,如其他答案中所述。