2

決定論的にサブスクライブを解除できない場合は、弱いイベントを使用しています (それ以外の場合は、弱いイベントの代わりに優先+=します)。-=

class SomeType
{
    public SomeType(...)
    {
        // object doesn't know when it will be removed
        WeakEventManager(SomeSource, EventArgs).AddHandler(someSourceInstance,
            nameof(SomeSource.SomeEvent), (s, e) => { ... });
    }
 }

このように、オブジェクトがガベージ コレクションされた場合、イベント ハンドラーは呼び出されません。完全。

でも。オブジェクトがまだガベージ コレクションされていない場合 (ただし、強い参照がなくなった場合)、イベント ハンドラーは引き続き呼び出されます。

私の質問はかなり一般的です:弱いイベントを使用するときはどうすればよいですか? 弱いイベントを使用する場合、イベント ハンドラーで無効な呼び出しを予期する必要がありますか? または、 GCにそのケースを回避するように強制する必要があります(決定論的な「クリーンアップ」のようなもの)? 他の何か?

4

1 に答える 1