繁体   English   中英

一个简单的.NET消息系统

[英]A simple .NET messaging system

我正在尝试创建一个系统来在C#组件之间发送消息(使用Mono运行时)。 以下是我在功能方面要实现的一些伪代码:

创建消息

MyMessage : BaseMessage {}
AnotherMessage : BaseMessage { string data; }

订阅

MyMessage.Subscribe(MyMessageHandler)
AnotherMessage.Subscribe(AnotherMessageHandler)

消息处理程序

void MyMessageHandler(MyMessage message)
{
    // code
}

void AnotherMessageHandler(AnotherMessage message)
{
    // code
}

发送消息

MyMessage.Send(MyMessageInstance);
AnotherMessage.Send(AnotherMessageInstance);

附加信息

每个消息处理程序只接受一种类型的消息,该消息可能有也可能没有任何类型的有效负载(例如,一个名为data的字符串)。


我有一个C++的工作解决方案(请参阅下面的订阅部分):

// A function-style macro is used to call this method
template <typename Type, typename Caller>
void subscribe(boost::function<void(const Type&)> subscriber, boost::shared_ptr<Caller> caller)
{
    m_subscriptions[typeid(Type)].connect(Subscribers::slot_type([subscriber](const BaseMessage& message)
    {
            subscriber(static_cast<const Type&>(message));
    }).track(caller));
}

对于那些不熟悉boost::signals2 .track.track会创建一个指向调用者的弱指针,并在订阅者被销毁时断开连接。


我的目标是在C#类似的东西,但我正在努力这样做。 这是我到目前为止:

abstract class Message<MessageArgType>
{
    public delegate void Handler(MessageArgType arg);
    private event Handler subscribers;

    public void Subscribe(Handler subscriber)
    {
        subscribers += subscriber;
    }

    public void Unsubscribe(Handler subscriber)
    {
        subscribers -= subscriber;
    }

    public void Send(MessageArgType arg)
    {
        subscribers.Invoke(arg);
    }
}

在我看来,这将存储对消息处理程序所属对象的引用。 经过大量的谷歌搜索,我最终找到了这个 然而,作为C#新手,我发现很难理解发生了什么。 此外,这篇文章是在2007年制作的,所以现在可能有更好的解决方案,但我很难找到一个。


总结一下

有人可以请给我一些指导如何从线程安全(由于GC在另一个线程上运行)方式从委托中获取弱引用,可以实现类似于上面的伪代码的接口?

在“无论你知道多少,总有更多”的情况下,我做了一些研究,发现.NET 3添加了WeakEventManager类。

http://msdn.microsoft.com/en-us/library/aa970850(v=vs.110).aspx

要使用Generic WeakEventManager类,请执行以下操作:

WeakEventManager<EventSource, SomeEventEventArgs>
    .AddHandler(source, "SomeEvent", source_SomeEvent);

编辑:

在你的情况下,你可能会做这样的事情:

public void Subscribe(Handler subscriber)
{
     WeakEventManager<Message, MessageArgType>
         .AddHandler(this, "subscribers", subscriber);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM