Я создаю простую систему обмена сообщениями для приложения Windows Phone Silverlight.
Идея состоит в том, что различные страницы xaml и другие объекты будут подписываться на объект обмена сообщениями, передавая тип сообщения, которое они хотят получить / обрабатывать, и делегат Action <> в качестве обработчика.
Когда происходит действие, сообщение (с полезной нагрузкой) будет отправлено нужным подписчикам.
Вот краткий набросок того, что я хочу в качестве класса сообщения.
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;
}
}
Так что подписчики varius добавят себя с типом Action. Как я понимаю, это предотвратит сборку мусора для исходных страниц / объектов (я полагаю, что это будет иначе?), Поскольку ссылка на него всегда будет существовать.
Я не могу на самом деле отписаться, или не всегда, и очередь сообщений останется на всю жизнь приложения.
Должен ли я реализовать WeakReferences, и если да, то как?
Добавит ли WeakReferences дополнительные накладные расходы?
Сумасшедший ли я даже подумать об этом, потому что используемая память будет крошечной?