0

パブリッシャー クラスとサブスクライバー クラスがあります。パブリッシャー クラスにはイベントがあり、サブスクライバーは、このイベントが発生したときに独自のメソッドの 1 つを実行したいと考えています。

これが、イベントを含む私の発行者クラスです。

public delegate EventHandler<MyEventArgs> MyEventHandler(object sender, MyEventArgs args);
public class MyEventArgs : EventArgs
{
    public string Content { set; get; }
}

public class Publisher
{
    public event MyEventHandler MyCustomEvent;

    public void TriggerEvent()
    {
        if(MyCustomEvent!=null)
            MyCustomEvent(this, new MyEventArgs{ Content = "Geeee! This isn't working!" });
    }
}

サブスクライバーは次のとおりです。

class Subscriber
{
    static void Main(string[] args)
    {
        Publisher publisher = new Publisher();

        //hook the event to a method
        publisher.MyCustomEvent += (s, e) => delegate
        {
            PrintThis(e.Content);
        };

       //Do something to trigger the event    
        publisher.TriggerEvent();
    }
    static public void PrintThis(string content)
    {
        Console.Write(content);
    }
}

パブリッシャーは、サブスクライバーを認識する必要はありません。パブリッシャーがイベントを呼び出したときに、サブスクライバーが PrintThis 関数を実行できるようにします。しかし、これは機能していません。ここで何が間違っていますか?

4

1 に答える 1

0

イベント ハンドラが正しく定義されていません。

次のようにします。

public delegate void MyEventHandler(object sender, MyEventArgs args);

戻り値の型が であることに注意してくださいvoid

そして、イベント ハンドラー自体は次のようになります。

    publisher.MyCustomEvent += (s, e) =>
    {
        PrintThis(e.Content);
    };

また、TriggerEventこのように定義すると、メソッドはより安全になります。

public void TriggerEvent()
{
    var mce = MyCustomEvent;
    if (mce!=null)
    {
        mce(this, new MyEventArgs{ Content = "Geeee! This isn't working!" });
    }
}

マルチスレッド環境では、MyCustomEventハンドラーはnullチェックと呼び出しの間で変わる可能性があります。

于 2015-01-28T02:54:20.930 に答える