我有一个 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/