gpt4 book ai didi

c# - 一个简单的 .NET 消息系统

转载 作者:行者123 更新时间:2023-11-30 16:12:23 24 4
gpt4 key购买 nike

我正在尝试创建一个系统来在 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);

附加信息

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


我在 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 创建一个指向调用者的弱指针,并在它被销毁时断开订阅者。


我的目标是在 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);
}
}

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


总结

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

最佳答案

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

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

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

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

编辑:

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

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

关于c# - 一个简单的 .NET 消息系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23047101/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com