我正在为 Windows phone silverlight 应用程序创建一个简单的消息传递系统。
这个想法是各种 xaml 页面和其他对象将订阅一个消息传递对象,传递他们想要接收/处理的消息类型和一个 Action<> Delegate 作为处理程序。
当一个动作发生时,一条消息(带有有效负载)将被发送给正确的订阅者。
这是我想要的消息类的快速草稿。
public class MessageBus
{
private List<Subscriber> subscribers;
public MessageBus()
{
subscribers = new List<Subscriber>();
}
public void Subscribe(string messageType, Action<object>subscriber){
subscribers.Add(new Subscriber(messageType, subscriber));
}
public void SendMessage(object message, string messageType)
{
foreach (Subscriber subscriber in subscribers)
{
if (subscriber.MessageType == messageType && subscriber.Reciever != null)
{
subscriber.Reciever(message);
}
}
}
}
public class Subscriber
{
public string MessageType { get; set; }
public Action<object> Reciever { get; set; }
public Subscriber(string messageType, Action<Object> reciever)
{
MessageType = messageType;
Reciever = reciever;
}
}
因此,各种订阅者将为自己添加一个类型,Action。据我了解,这将阻止原始页面/对象被垃圾收集(我认为它会是其他情况?)因为对它的引用将始终存在。
我无法真正取消订阅,或者并非总是如此,并且消息队列将在应用程序的整个生命周期内一直存在。
我应该实施 WeakReferences 吗?如果是,如何实施?
WeakReferences 会增加更多开销吗?
考虑到这一点,我是否疯了,因为正在使用的内存很小?