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   
  • 相关阅读:
    [1.2]由UML模型通过XMI生成XML,通过XSLT展示到表现层
    [1.1]XMI 与UML结合开发企业应用中业务模型
    如何创建脱机数据库应用程序思路
    SAML在无线网络传输的应用[对照文]
    SoberGGG对针式PKM的初次测评
    [转]美国知名天使投资人列出愿意投资的30大创意方向
    针式PKM适合哪些用户使用?
    没有个人知识管理就是觉得学了很多,却不得记到底学到了什么。
    [转]人之患在好为人师
    [转]一位中国的黑客的一封信!
  • 原文地址:https://www.cnblogs.com/dyufei/p/2573931.html
Copyright © 2011-2022 走看看