zoukankan      html  css  js  c++  java
  • 窗口close 后资源无法释放的问题

    最近碰到一个窗口close()后资源无法释放的问题,找了很久才发现原来时存在交叉引用,虽然close()但是该form的对象依然被其他对象所引用,所以垃圾收集器并不能回收该form所占的资源。

    public class DeviceManager : IDeviceMonitorStatusNotify
        {
          public IDeviceManagerNotify    deviceManagerNotify;
          public DeviceManager(IDeviceManagerNotify   notify)
            {
              deviceManagerNotify = notify;
            }
      
            public void ReleaseAll()
    10          {
    11             //do some release resource
    12          }
    13    }
    14   
    15  public MainForm()
    16     {
    17         deviceManager = new  DeviceManager(this);
    18         private void ExitMainForm_Click(object sender, EventArgs e)
    19            {                  
    20               deviceManager .ReleaseAll();
    21                this.Close();
    22            }
    23      }
    24   

    当MainForm 执行 this.Close()后 MainForm 和DeviceManager 所占的资源并不会被释放,因为MainForm 对象被DeviceManager 所引用、

    DeviceManager 对象被MainForm 所引用,形成了交叉引用 ,虽然执行Close方法但是并不能释放资源,垃圾收集器并不会执行资源收集。

    一个form关闭之前应该该对象是否被其他对象所引用,如果被引用则先将该对象的引用置为null,然后再close()才能释放该form所占的资源。

    public class DeviceManager : IDeviceMonitorStatusNotify
        {
          public IDeviceManagerNotify deviceManagerNotify;
          public DeviceManager(IDeviceManagerNotify notify)
            {
                  deviceManagerNotify = notify;
            }
      
            public void ReleaseAll()
    10          {
    11               //do some release resource
    12               //将对MainForm 的引用置为null
    13              deviceManagerNotify = null;
    14          }
    15    }
    16   
    17   
    18  public MainForm()
    19     {
    20         
    21         deviceManager = new DeviceManager(this);
    22         private void ExitMainForm_Click(object sender, EventArgs e)
    23              {  
    24                  deviceManager.ReleaseAll();
    25                   //将对DeviceManager 的引用置为null
    26                  LocalManagers._Instance.DeviceManager = null;
    27                   //没有交叉引用,close后资源可以被垃圾收集器回收
    28                   this.Close();
    29               }
    30      }
    31   
  • 相关阅读:
    vagrant 入门3
    vagrant 入门4
    vagrant 入门2
    Map、Debug追踪
    Comparator比较器 、Comparable接口
    File类
    Lambda表达式、函数式编程思想概述
    异常--异常体系、异常的处理、异常的捕获、finally语句块和自定义异常
    List集合、Set集合、Collection集合工具类
    数据结构---栈、队列、数组、链表和红黑树
  • 原文地址:https://www.cnblogs.com/dyufei/p/2573931.html
Copyright © 2011-2022 走看看