分享

.NET弱引用

 LYS404 2015-07-28

      当把一个对象引用分配给一个变量时,该变量就包含对对象的一个强引用(strong reference)。垃圾收集器不会收回强引用仍在使用的对象。只要当变量离开作用域,或者显示地给变量分配null时,强引用才被删除。

      弱引用(weak reference)可以保持对对象的引用,同时允许垃圾收集器在它认为适当的垃圾收集时间释放对象,回收内存。假设有一个对象创建相对便宜,但需耗费大量的内存,如果希望保持这个对象,在应用程序需要使用它,但也希望能够告诉垃圾收集器,在必要时把内存收回。

      弱引用可以通过WeakReference类引用。

      在下面的实例代码中,在ASP.NET应用程序开始时创建了一个32KB的字符串,把字符串分配给一个WeakReference实例,并把弱引用放在Application对象中供以后检索。在Application_Start中的bigString变量离开作用域后,将不存在对字符串实例的强引用。

        void Application_Start(object sender, EventArgs e)
        {
            String bigString = new String('A', 32768);
            WeakReference weakRef = new WeakReference(bigString);
            Application.Add("BigString",weakRef);
        }

 

      如果能在垃圾收集发生之前访问Application对象检索字符串,WeakReference对象的Target属性将包含对字符串的一个对象引用。如果Target属性为空,被弱引用的对象就已经被执行垃圾收集了。要使用就要重新创建这个字符串。否则,可以提取Target属性并用bigString变量创建一个强引用,然后在应用程序的开始处使用所创建的字符串对象。

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
                GetBigString();
        }

        private void GetBigString()
        {
            WeakReference weakReference;

            if (Application["BigString"] != null)
            {
                weakReference = Application["BigString"] as WeakReference;

                String bigString;
                bigString = weakReference.Target as String;

                if (bigString != null)
                    lbMessage.Text = "BigString retrieved from WeakReference";
                else
                    lbMessage.Text = "BigString was garbage collected";

            }
            else
                lbMessage.Text = "Unable to retrieved BigString From Application";
        }

        protected void btnGC_Click(object sender, EventArgs e)
        {
            GC.Collect();
            GetBigString();
        } 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多