1

オブジェクトへのWeakReferencesを含むコレクションがあります。オブジェクトは実行時に動的にロードされ、GCによってランダムに収集できます。

ときどき、オブジェクトを完全に削除する必要があります。これは非同期DBコマンドで実行されます。意味-削除コマンドと永続性データベースでの削除の実際のコミットの間に、オブジェクトをGCしてから、DBから再ロードできる期間があります。

これを解決する最も簡単な方法は、各オブジェクトに「削除済み」フラグを設定することです(すでに1つあります)。削除アクションを実行するときに、削除されたオブジェクトへの強力な参照をDBコマンドオブジェクトに追加します。操作が完了すると、強力な参照が失われ、オブジェクトを永久に解放できます。

問題は、GCが先読みでオブジェクトを収集することを許可されているかどうかです。このシナリオに適用されますか?DBコマンドがデキューされて処理されるまで、オブジェクトが収集されないことが保証されていますか?

下位レベルの詳細は次のとおりです。

Dictionary<Int64, WeakReference> mItems;
struct IOCommand
{
    public CommandDetails command;
    public object[] strongReferences;
}
Queue<IOCommand> mIOQueue;
void queueCommand(CommandDetails command, object relatedObject)
{...}

コマンドをキューに入れるときに、関連するオブジェクトを、処理されるまでキューに保持されている強力な参照として渡しますが、オブジェクトが使用されていないため、最適化できるかどうかが問題になります...

アミット。

4

2 に答える 2

3

コードにオブジェクトへの(弱いではない)参照がある限り、それは収集されません。

したがって、安全である必要があります。(将来の)Dbコマンドが参照を使用するという事実自体が、参照が引き続き存在することを確認します。

この場合、WeakReferenceに依存しないように注意してください。この場合、強い参照には適切な寿命が必要です。


しかし、オブジェクトは使用されていないので、問題はそれらを最適化できるかどうかです...

いいえ。それらを保存する方法は、コマンドがキューに保存されている限り、そしてもちろんキューに到達可能である限り、それらが存在することを確認します。

しかし、それらが実際に使用されていない場合でも、それは問題ではないことに注意してください...

于 2012-05-06T15:42:14.000 に答える
1

GCは、それを参照して何かを削除してはなりません。WeakReferenceは、参照しているものを収集することを特に選択した場合の例外です。DBコマンドに削除するオブジェクトへの参照がある場合は、問題ありません。

于 2012-05-06T15:43:05.800 に答える