涉及发布者订阅者不工作的 C# 事件处理
C# Event Handling involving publisher subscriber not working
我有一个发布者 class 和一个订阅者 class。发布者 class 有一个事件,而订阅者希望在引发此事件时执行自己的方法之一。
这是我的发布者 class 及其活动:
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 函数。但这是行不通的。我在这里做错了什么?
您没有正确定义事件处理程序。
这样做:
public delegate void MyEventHandler(object sender, MyEventArgs args);
注意 return 类型是 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
检查和调用之间更改。
我有一个发布者 class 和一个订阅者 class。发布者 class 有一个事件,而订阅者希望在引发此事件时执行自己的方法之一。
这是我的发布者 class 及其活动:
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 函数。但这是行不通的。我在这里做错了什么?
您没有正确定义事件处理程序。
这样做:
public delegate void MyEventHandler(object sender, MyEventArgs args);
注意 return 类型是 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
检查和调用之间更改。