2011-12-05 12 views
3

私はアプリケーション内のオブジェクトへの弱い参照でいっぱいのコレクションを持っています。 このコレクションの期限切れの参照をクリーンアップする最も良い方法は何ですか。定期的に参照を参照して削除するタイマーオブジェクトを持つことをお勧めしますか?これをC#.NETで行うより良い方法はありますか? 編集:私のシナリオでは、コレクションはアプリケーション用に一度作成され、アプリケーションの実行中に存在するため、サイズが大きくなります。そのサイズを維持することが重要です。弱い参照のコレクションをクリーンアップする方法はありますか?

私は、フレームワークのバージョン3.5またはそれ以前のソリューションを好むでしょう。おかげさまで

答えて

4

これをタイマーで実行すると、過剰な処理が行われる可能性があり、対処する同時実行性の問題が発生します。

他の操作の一部としてデッドリファレンスをクリーンアップするのはどうですか?たとえば、それがリストであり、順序が重要でない場合、新しい項目を追加すると、最後に追加するのではなく、見つかった最初の参照を新しい項目に置き換えることができます。何かイベントが発生すると予想されないときはいつでもスイープを起動します。も頻繁に発生します。おそらく、参照がデッドリファレンスを取得したときに発生します。

+0

私は並行性について同意しています。私はすでにクリーンアップ操作がスレッドセーフであるべきであることを覚えています。問題は、このコレクションがその使用法を取得するさまざまなシナリオをカバーすることができないことです。つまり、他の人が使用するライブラリの一部になるということです。 –

+1

しかし、シーケンシャルコードソリューションは機能しますか?マルチスレッドは必要がないときに早すぎる最適化の一種です。 –

+0

私が言及したように、私は私のコレクションがどのように使われているかをコントロールできないかもしれません。マルチスレッド環境で使用する場合は、同期が不可避であると私は信じています。 –

1

あなたは、不要なweakreferencesを流し

  • を完了するために、完全なガベージコレクションを待っ
    • とを交互にスレッドを開始することができます。

    http://msdn.microsoft.com/en-us/library/system.gcnotificationstatus.aspx

    他の人が述べたように、あなたは別のスレッドを必要とする任意のアプローチと並行性の問題に対処する必要があります。

  • 関連する問題