2009-09-02 25 views
2

この場合、プロキシのCloseCompletedイベントを購読するのは悪いですか?C#拡張メソッドでイベントを購読するのは悪い習慣ですか?

public static void Close(this MyWCFServiceClient proxy) 
{ 
      proxy.CloseCompleted += (o, e) => 
      { 
       if (e.Error != null) 
        proxy.Abort(); 
      }; 

      proxy.CloseAsync(); 
} 

プロキシは、もはや任意のコードで参照されている場合に、それはまだガベージコレクションを取得しません、または拡張メソッド内のイベントサブスクリプションは、プロキシへの参照を保持してたむろしますか?

答えて

5

すなわち明確///マークアップで文書化、私はそれが悪い習慣です言わないだろうが、一般的なケースでは、おそらく、この現象が発生しようとしていることは明らかであろう。しかし、の場合ケースでは、オブジェクトの死について話しているので、呼び出し元はメソッドを呼び出した後にオブジェクトで多くのことを行うとは思わないでしょう。私はまた、これが非同期であることを(おそらくメソッド名で)明確にしたいと思うでしょう。

再ガベージコレクション。イベントはサブスクライバを生きている;出版社ではありません。 proxyが適格であれば、それが収集されます。匿名メソッドはキャプチャされたスコープにアクセスするようには見えません(proxy自体を除く)。したがって、とにかく(デリゲートインスタンス自体を除いて)生き続けるのは面白いことはありません。

+0

また、proxy.Abort()を使用するとどうなりますか?ここでのプロキシはメソッドのパラメータなので、このラムダによって取得されるため、プロキシオブジェクトへの参照を保持するクラスを作成して割り当てる必要があります(結局のところ、通常のメソッドパラメータであり、拡張メソッドは変更されません何か)。もちろん、同じように動作するので、コレクションには何も変わりません。 –

+0

ああ、確かに。あなたは送信者をキャストすることによってそれを避けることができるかもしれませんが、あなたは正しいです。そしてあなたが言うように、それはとにかくコレクションに影響を与えません。 –

1

プロキシには匿名の代理人への参照があります。その逆もありません。したがって、誰もプロキシを参照しない場合は、プロキシと匿名の両方がクリーンアップされます。

関連する問題