相关疑难解决方法(0)

为什么以及如何避免事件处理程序内存泄漏?

我刚刚意识到,通过阅读StackOverflow上的一些问题和答案,+=在C#(或者我猜,其他.net语言)中添加事件处理程序会导致常见的内存泄漏......

我过去曾多次使用这样的事件处理程序,并且从未意识到它们可能导致或导致我的应用程序中的内存泄漏.

这是如何工作的(意思是,为什么这实际上会导致内存泄漏)?
我该如何解决这个问题?是否-=足够使用相同的事件处理程序?
是否有常见的设计模式或最佳实践来处理这样的情况?
示例:我应该如何处理具有许多不同线程的应用程序,使用许多不同的事件处理程序在UI上引发多个事件?

是否有任何好的和简单的方法可以在已经构建的大型应用程序中有效地监控它?

c# memory-leaks design-patterns event-handling

148
推荐指数
3
解决办法
5万
查看次数

如何取消订阅C#中特定类的事件的所有处理程序?

基本前提:

我有一个房间,当一个阿凡达"进入"房间内的所有头像时,它会发布一个事件.当阿凡达离开房间时,我希望它删除该房间的所有订阅.

在将"阿凡达"添加到新房间并订阅新房间的活动之前,我怎样才能最好地取消订阅房间中所有活动的阿凡达?

代码如下:

class Room
{
   public event EventHandler<EnterRoomEventArgs> AvatarEntersRoom;
   public event EvnetHandler<LeaveRoomEventArgs> AvatarLeavesRoom;
   public event EventHandler<AnotherOfManyEventArgs> AnotherOfManayAvatarEvents;


   public void AddPlayer(Avatar theAvatar)
   {
      AvatarEntersRoom(this, new EnterRoomEventArgs()); 

      AvatarEntersRoom += new EventHandler<EnterRoomEventArgs>(theAvatar.HandleAvatarEntersRoom);

      AvatarLeavesRoom += new EventHandler<EnterRoomEventArgs>(theAvatar.HandleAvatarEntersRoom);

      AnotherOfManayAvatarEvents += new EventHandler<EnterRoomEventArgs>(theAvatar.HandleAvatarEntersRoom);          

   }

}

class Avatar
{
   public void HandleAvatarEntersRoom(object sender, EnterRoomEventArgs e)
   {
       Log.Write("avatar has entered the room");
   }

   public void HandleAvatarLeaveRoom(object sender, LeaveRoomEventArgs e)
   {
       Log.Write("avatar has left room");
   }

   public void HandleAnotherOfManayAvatarEvents(object sender, AnotherOfManyEventArgs e)
   {
       Log.Write("another avatar event has …
Run Code Online (Sandbox Code Playgroud)

.net c# events

33
推荐指数
2
解决办法
3万
查看次数