3

ユーザーがドラッグ&ドロップを使用してwpfツリービューを操作することでビジネスを行うac#アプリがあります。元に戻すスタックは、最初からすべてをロールバックするためのいくつかのユーザー機能を提供し、約 500 ステップまでに制限されています。

そのため、これらのオブジェクト参照が undostack 内にある場合、GC はそれらをファイナライズできません。

コピー アンド ペーストを使用して、ソフトウェア テスターはこの方法で 2 つのノードを相互にコピーし、これをたとえば 20 回繰り返します。 . そのため、コピー操作によってさらに 1048576 個のオブジェクトが作成される可能性があるため、元に戻すスタックには、1 回の元に戻すステップで 1048576 個のオブジェクト参照が格納されます。テスターは、このアプリのクラッシュを簡単に作成できます。

タイプ 'System.OutOfMemoryException' の例外がスローされました。

そのため、元に戻すスタックを制限しても、オブジェクトが多すぎるという問題は解決されません。

それに加えて、これほど多くのオブジェクトを使用するユース ケースはありません。

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 に答える