如何在C#或.NET中遵循发布者/订阅者策略?

Dim*_* C. 1 .net c#

什么是C#中的最合适的语言结构,或.NET的BCL中的类或函数,以遵循发布者/订阅者(又称信号/插槽)策略?

Jon*_*eet 7

C#和VB中的事件是处理pub/sub的典型语言结构:

public class Publisher
{
    public event EventHandler MyEvent;

    private void RaiseEvent()
    {
        EventHandler handler = MyEvent;
        if (handler != null)
        {
            handler(this, EventArgs.Empty);
        }
    }
}

public class Subscriber
{
    public void Subscribe(Publisher pub)
    {
        pub.MyEvent += MethodToCall;
    }

    private void MethodToCall(object sender, EventArgs e)
    {
        // This will be called from Publisher.RaiseEvent
    }
}
Run Code Online (Sandbox Code Playgroud)

替代方案包括Reactive ExtensionsWPF Commanding.

请注意,如果它Publisher是长寿命但Subscriber应该是短暂的,Subscriber则需要取消订阅事件 - 否则Publisher将保留对事件的引用Subscriber,从而防止垃圾收集.