3

我有一个 ac# 应用程序,其中用户通过使用拖放操作使用 wpf 树视图来做一些业务。Undo 堆栈提供了一些用户功能,可以从一开始就回滚所有内容,并且大约限制为大约 500 步。

因此,如果这些对象引用在 undostack 内,则不允许 GC 完成它们,因为用户可能希望它回来。

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

引发了“System.OutOfMemoryException”类型的异常。

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

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

msdn 告诉我:

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

在我的情况下,我怎样才能实现这一点,保持撤消功能?

4

3 回答 3

1

我建议你避免玩 GC。我会考虑改变你的业务逻辑(可能是限制副本?)。此外,您可能可以将撤消步骤存储(持久)在磁盘上的某个位置,让它们从内存中消失。

于 2013-03-28T11:23:33.433 回答
1

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

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

于 2013-03-28T11:24:55.637 回答
1

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

话虽如此,如其他答案中所述,序列化您的撤消堆栈或更改您的业务逻辑以避免能够无限制地复制/粘贴会更可取。

于 2013-03-28T11:28:06.467 回答