如何让事件只允许一个客户订阅?少数情况下,比如像上面,为了避免发生“值覆盖”的情况(更多是在异步调用方法时,后面会讨论),我们可能想限制只允许一个客户端注册。此时怎么做呢?我们可以向下面这样,将事件声明为private的, 然后提供发布者提供两个方法来进行注册和取消注册. (前一博文是subseribe.Subscribe(publisher)进行注册).
代码:
namespace DelegateEventDemo{ class Class3 { [STAThread] static void Main2(string[] args) { Publishser publisher = new Publishser(); Subscriber1 subscribe = new Subscriber1(); publisher.Register(subscribe.OnNumberChanged); publisher.DoSomething(); // unregister publisher.UnRegister(subscribe.OnNumberChanged); publisher.DoSomething(); // will not invoke the method } } public delegate string GeneralEventHandler(); // 定义事件发布者 public class Publishser { private event GeneralEventHandler NumberChanged; // 声明一个私有事件 // 注册事件 public void Register(GeneralEventHandler method) { // 注意不是+=. 在客户端只能是+=或是-=, 但是在定义类可以是=, += NumberChanged = method; } // 取消注册 public void UnRegister(GeneralEventHandler method) { NumberChanged -= method; } public void DoSomething() { // 做某些其余的事情 if (NumberChanged != null) { // 触发事件 string rtn = NumberChanged(); Console.WriteLine("Return: {0}", rtn); // 打印返回的字符串,输出为Subscriber3 } } } // 定义事件订阅者 public class Subscriber1 { public string OnNumberChanged() { return "Subscriber1"; } }}
我们看到,unregister后的方法不会再调用: