【问题标题】:C# Event Handling involving publisher subscriber not working涉及发布者订阅者的 C# 事件处理不起作用
【发布时间】:2015-01-28 02:45:28
【问题描述】:

我有一个发布者类和一个订阅者类。发布者类有一个事件,而订阅者希望在引发此事件时执行它自己的方法之一。

这是我的发布者类及其事件:

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 函数。但这不起作用。我在这里做错了什么?

【问题讨论】:

  • 什么不起作用?
  • PrintThis 函数处的断点永远不会被命中。控制台上没有打印任何内容。

标签: c# event-handling custom-events


【解决方案1】:

您没有正确定义事件处理程序。

这样做:

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 检查和调用之间发生变化。

【讨论】:

  • 哦..这行得通!非常感谢 :) 有什么区别?我的意思是编译器没有给出任何语法错误。
  • 如果你明确地转换为delegate(你做了),编译器在从一个委托转换到另一个委托时非常宽松。如果您只取出 delegate 关键字,您会看到一条错误消息。
猜你喜欢
  • 1970-01-01
  • 2014-10-06
  • 1970-01-01
  • 2019-08-03
  • 1970-01-01
  • 2016-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多