2

EventAgregator パターンを使用して、イベントをサブスクライブおよび公開しています。ユーザーがラムダ式を使用してイベントをサブスクライブする場合、弱参照ではなく強参照を使用する必要があります。そうしないと、パブリッシュが実行される前に式がガベージ コレクションされる可能性があります。

DelegateReference に簡単なチェックを追加して、プログラマーがラムダ式を渡し、弱い参照を使用している場合に引数の例外をスローするようにしたいと考えました。これは、コードを「監視」するのに役立ちます。

例:

eventAggregator.GetEvent<RuleScheduler.JobExecutedEvent>().Subscribe
        (
            e => resetEvent.Set(),
            ThreadOption.PublisherThread,
            false,
            // filter event, only interested in the job that this object started
            e => e.Value1.JobDetail.Name == jobName
        );


public DelegateReference(Delegate @delegate, bool keepReferenceAlive)
    {
        if (@delegate == null)
            throw new ArgumentNullException("delegate");

        if (keepReferenceAlive)
        {
            this._delegate = @delegate;
        }
        else
        {
            //TODO: throw exception if target is a lambda expression
            _weakReference = new WeakReference(@delegate.Target);
            _method = @delegate.Method;
            _delegateType = @delegate.GetType();
        }
    }

何か案は?@delegate.Method.IsStatic を確認できると思いましたが、うまくいくとは思いません... (すべてのラムダ式は静的ですか?)

4

1 に答える 1

1

いいえ、すべてのラムダ生成デリゲートが静的メソッドであるとは限りません。キャプチャされた変数がある場合、それはインスタンスになる可能性があります。しかし、最終的には、ラムダ ベースのデリゲート、匿名メソッド ベースのデリゲート、および明示的なデリゲートの間にほとんど違いはありません。追加のロジックは実行しません。単にデリゲートとして扱います (WeakReferenceコードを完全に削除します)。

于 2010-06-02T18:44:54.883 に答える