自动取消订阅事件



我有一个静态类,它发布一些事件。所以我有很多不同的小类,它们有不同的生存期,订阅了这个事件。

我现在发现,这会导致内存"泄漏",因为订阅类在订阅寿命更长的事件时会保持活动状态。我知道这是通过使用内存探查器发生的,我读到了这个问题。

我无法手动取消订阅,因为我的列表中可能有数百个"客户"。这个列表将被清除。所以我不能(也不想)手动取消订阅。

我读到"弱事件模式"可能在这里有所帮助。有人能告诉我一个"简单"的方法来实现这一点吗?到目前为止,我所发现的要么太简单,无法在实践中使用,要么太复杂,无法在一开始就理解。

或者对于这种情况有什么"最佳实践"吗?

提前感谢!

更新:根据jbl的回答,我发现(http://blogs.msdn.com/b/greg_schechter/archive/2004/05/27/143605.aspx)作为一种可能的解决方案。有什么意见吗?它相当古老(2004年),所以可能有更好的解决方案?

从未实现过这样的东西,但我会尝试(使用静态类或单例,您可以选择):

  • 让静态类维护对客户端事件处理程序的WeakReference的静态集合
  • 客户端不直接订阅该事件。静态类公开订阅和取消订阅方法,这些方法从弱引用集合中添加/删除处理程序
  • 静态类是唯一一个直接订阅事件的类
  • 在事件触发时,静态类枚举弱引用集合,并为仍然有效的引用运行处理程序(删除空引用)

希望这将有助于

最佳实践:当一个类订阅了由非该类构造的对象生成的事件时,始终实现Dispose模式。

然后在Dispose方法中移除处理程序。

public NotificationServiceAccessor(ObjectWithEvent objectWithEvent)
{
_notificationService = new NotificationService();
_notificationService.StatusChanged += NotificationService_StatusChanged; // Local object, no Dipose
_objectWithEvent = objectWithEvent;
_objectWithEvent.AnEvent += AnEventHandler(); // Event that has to be disposed.
}
#region IDisposable Members
protected bool Disposed { get; private set; }
private void Dispose(bool disposing)
{
if (!this.Disposed)
{
this.InternalDispose(disposing);
}
this.Disposed = true;
}
protected virtual void InternalDispose(bool disposing)
{
if (disposing)
{
// Dispose here the event handlers
_objectWithEvent.AnEvent -= AnEventHandler()
}
// Dispose here only unmanaged objects 
// Don’t use managed objects here because maybe 
// they have been finalized already
}
public void Dispose()
{
this.Dispose(true);
GC.SuppressFinalize(this);
}
~NotificationServiceAccessor()
{
this.Dispose(false);
}
#endregion

相关内容

  • 没有找到相关文章

最新更新