0

重複の可能性:
C# でイベント サブスクリプションをサブスクライブすることは可能ですか?

イベント イベントに関する情報を検索するのは簡単ではありません。できないからではないことを願うばかりです。その答えが「そのためのイベントがある」または他の手段であることを願っています。

イベントのリッスンが比較的高価なイベントを扱っています。(私が結び付けている別のシステムでは、監視する必要があり、追跡するものと COM オーバーヘッドを追跡する必要があります。)

したがって、何かがそれを望んでいることがわかっていない限り、イベントを監視したくありません。

それを行う簡単な方法は次のとおりです。

public class MyThing
{
    public delegate void MyEventHandler(object sender, MyEventArgs ea);
    public event MyEventHandler Change;

    public void StartWatching()
    {
        ...
    }

    public void StopWatching()
    {
        ...
    }
}

これは次のように使用されます。

var thing = new MyThing();
thing.Change += this.thing_Change
thing.StartWatching();

thing.Change -= this.thing_Change
thing.StopWatching();  // Hopefully nothing else is watching...

しかし、これは私が望むほどエレガントではありません。に置き換えることでそれを行うことができthing.Change += xthing.StartWatching(x)それから監視が開始され、逆に if がチェックChange == nullされますが、イベント モデルの完全な優雅さでそれを行うことができればと思います。

4

3 に答える 3

1

イベントのadd/removeメソッドをオーバーライドして、そこで作業を行うことができます。

public class MyThing
{
    public delegate void MyEventHandler(object sender, MyEventArgs ea);

    private MyEventHandler _change;
    public event MyEventHandler Change
    {
       add 
      { 
          var previousChange = _change;
          _change += value; 
          if (previousChange == null)
          {
             StartWatching();
          }
       }
       remove 
       { 
          _change -= value;
          if (_change == null) 
          {
             StopWatching();
          }
       }
    }

    public void StartWatching()
    {
        ...
    }

    public void StopWatching()
    {
        ...
    }
}

現在、これはスレッドセーフではありませんが、簡単に作成できます。

于 2012-11-29T06:00:09.473 に答える
1

カスタム イベント アクセサーが探しているもののように思えます。

int count = 0;

event EventHandler MyThing.Change
{
    add
    {
        lock (Change)
        {
            if (count == 0)
            {
                StartWatching();
            }

            count++;
            Change += value;
        }
    }
    remove
    {
        lock (Change)
        {
            count--;
            if (count == 0)
            {
                StopWatching();
            }

            Change -= value;
        }
    }
}
于 2012-11-29T05:56:09.593 に答える
1

イベントをプロパティとして宣言し、追加/削除アクセサーを使用してみてください

class YourClass
{
    public event EventHandler<EventArgs>  MyEvent
    {
        add
        {
            // Add new subscriber code here
        }

        remove
        {
            // Remove subscriber code here
        }
    }
}
于 2012-11-29T05:56:27.560 に答える