婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > .net非托管資源的回收方法

.net非托管資源的回收方法

熱門標簽:柳州電銷機器人公司 百度地圖怎樣做地圖標注 征途美甲店地圖標注 太原400電話上門辦理 電銷語音機器人型號參數 昆明語音電銷機器人價格 騰訊地圖標注手機 浦發電話機器人提醒還款 400電話如何申請取消

本文實例講述了.net非托管資源的回收方法,分享給大家供大家參考。具體分析如下:

釋放未托管的資源有兩種方法
 
1、析構函數

2、實現System.IDisposable接口
 
一、析構函數 
構造函數可以指定必須在創建類的實例時進行的某些操作,在垃圾收集器刪除對象時,也可以調用析構函數。析構函數初看起來似乎是放置釋放未托管資源、執行一般清理操作的代碼的最佳地方。但是,事情并不是如此簡單。由于垃圾回收器的運行規則決定了,不能在析構函數中放置需要在某一時刻運行的代碼,如果對象占用了寶貴而重要的資源,應盡可能快地釋放這些資源,此時就不能等待垃圾收集器來釋放了. 
實例

復制代碼 代碼如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MemRelease
{
    class Program
    {
        ~Program()
        {
            // Orders.
        }
        static void Main(string[] args)
        {
        }
    }
}

 
在IL DASM中,你會發現并沒有這個析構的方法。C#編譯器在編譯析構函數時,會隱式地把析構函數的代碼編譯為Finalize()方法的對應代碼,確保執行父類的Finalize()方法 看下這段代碼中對于析構函數的編譯:

復制代碼 代碼如下:
.method family hidebysig virtual instance void
        Finalize() cil managed
{
  // Code size       14 (0xe)
  .maxstack  1
  .try
  {
    IL_0000:  nop
    IL_0001:  nop
    IL_0002:  leave.s    IL_000c
  }  // end .try
  finally
  {
    IL_0004:  ldarg.0
    IL_0005:  call       instance void [mscorlib]System.Object::Finalize()
    IL_000a:  nop
    IL_000b:  endfinally
  }  // end handler
  IL_000c:  nop
  IL_000d:  ret
} // end of method Program::Finalize

 
使用析構函數來釋放資源有幾個問題:
 
1、與C++析構函數相比,C#析構函數的問題是他們的不確定性。在刪除C++對象時,其析構函數會立即執行,但是由于垃圾收集器的工作方式,無法確定C#對象的析構函數何時執行。
2、C#析構函數的執行會延遲對象最終從內存中刪除的時間。有析構函數的對象需要2次處理才能刪除:第一次調用析構函數時,沒有刪除對象,第二次調用才真正刪除對象。
 
二、IDisposable接口

IDisposable接口定義了一個模式,為釋放未托管的資源提供了確定的機制,并避免產生析構函數固有的與垃圾函數器相關的問題。IDisposable接口聲明了一個方法Dispose(),它不帶參數,返回void。
 
1、MSDN建議按照下面的模式實現IDisposable接口
 

復制代碼 代碼如下:
public class Foo: IDisposable
 {
     public void Dispose()
     {
        Dispose(true);
        GC.SuppressFinalize(this);
     }
     protected virtual void Dispose(bool disposing)
     {
        if (!m_disposed)
        {
            if (disposing)
            {
               // Release managed resources
            }
            // Release unmanaged resources
            m_disposed = true;
        }
     }
     ~Foo()
     {
        Dispose(false);
     }
     private bool m_disposed;
 }

 
在.NET的對象中實際上有兩個用于釋放資源的函數:Dispose和Finalize
 
(1)、Finalize的目的是用于釋放非托管的資源,而Dispose是用于釋放所有資源,包括托管的和非托管的
 
(2)、void Dispose(bool disposing)函數通過一個disposing參數來區別當前是否是被Dispose()調用
如果是被Dispose()調用,那么需要同時釋放托管和非托管的資源。如果是被~Foo()(也就是C#的Finalize())調用了,那么只需要釋放非托管的資源即可。
 
(3)、Dispose()函數是被其它代碼顯式調用并要求釋放資源的,而Finalize是被GC調用的
在GC調用的時候Foo所引用的其它托管對象可能還不需要被銷毀,并且即使要銷毀,也會由GC來調用。因此在Finalize中只需要釋放非托管資源即可。另外一方面,由于在Dispose()中已經釋放了托管和非托管的資源,因此在對象被GC回收時再次調用Finalize是沒有必要的,所以在Dispose()中調用GC.SuppressFinalize(this)避免重復調用Finalize。
 
然而,即使重復調用Finalize和Dispose也是不存在問題的,因為有變量m_disposed的存在,資源只會被釋放一次,多余的調用會被忽略過去。
 
Finalize、Dispose保證了:
 
(1)、 Finalize只釋放非托管資源;
(2)、 Dispose釋放托管和非托管資源;
(3)、 重復調用Finalize和Dispose是沒有問題的;
(4)、 Finalize和Dispose共享相同的資源釋放策略,因此他們之間也是沒有沖突的。
 
2、IDisposable例子

復制代碼 代碼如下:
namespace 資源回收
{
    class Program
    {
        static void Main(string[] args)
        {
            //使用using對實現IDisposable的類了進行資源管理
/*拿到一個對象的時候,首先判斷這個對象是否實現了IDisposable接口,如果實現了,最好就用using包裹住這個對象,保證這個對象用完之后被釋放掉,否則很可能出現資源泄露的問題
*/
            using (Telphone t1 = new Telphone())
            {
                t1.Open();
                t1.Speak("hello");
                t1.Bomb();
                //t1.Dispose();//如果在這里調用了Dispose()方法釋放資源,那么在執行t1.Open()方法就出錯,電話線已經被剪斷了,無法再打電話了
                t1.Open();
                t1.Speak("I am back!");
            }//代碼執行到這里后,就會調用Dispose方法來進行資源回收
            Console.ReadKey();
        }
    }
    /// summary>
    /// Telphone類實現了IDisposable接口
    /// /summary>
    class Telphone : IDisposable
    {
        /// summary>
        /// 電話狀態
        /// /summary>
        private TelphoneState state;
        /// summary>
        /// 打電話
        /// /summary>
        public void Open()
        {
            if (state == TelphoneState.Disposed)
            {
                throw new Exception("電話線已經被剪斷,無法打開!");
            }
            state = TelphoneState.Open;
            Console.WriteLine("拿起電話");
        }
        /// summary>
        /// 說話
        /// /summary>
        /// param name="s">說話內容/param>
        public void Speak(string s)
        {
            if (state != TelphoneState.Open)
            {
                throw new Exception("沒有連接");
            }
            Console.WriteLine(s);
        }
        /// summary>
        /// 掛掉電話
        /// /summary>
        public void Bomb()
        {
            state = TelphoneState.Close;
            Console.WriteLine("掛掉電話");
        }
        IDisposable 成員
    }
    /// summary>
    /// 電話狀態枚舉
    /// /summary>
    enum TelphoneState
    {
        Open, Close, Disposed
    }
}

 
程序運行結果如下圖所示:
 
 
 
三、析構函數和IDisposable混合調用的例子

復制代碼 代碼如下:
public class ResourceHolder : IDisposable
{
      private bool isDispose = false;
      // 顯示調用的Dispose方法
  public void Dispose()
      {
           Dispose(true);
          GC.SuppressFinalize(this);
       }
       // 實際的清除方法
  protected virtual void Dispose(bool disposing)
      {
            if (!isDisposed)
           {
              if (disposing)
           {
                      // 這里執行清除托管對象的操作.
                  }
                  // 這里執行清除非托管對象的操作
            }
         isDisposed=true;
      }
      // 析構函數
      ~ResourceHolder()
      {
            Dispose (false);
      }
}

希望本文所述對大家的asp.net程序設計有所幫助。

您可能感興趣的文章:
  • ASP.NET主機資源控制的一些心得
  • asp.net(C#) 開源資源大匯總
  • asp.net中資源文件的使用
  • 實例講解.NET中資源文件的創建與使用
  • asp.net 組件開發中的內嵌資源引用
  • .NET 資源文件resx、Resources詳細說明
  • ASP.NET 服務器路徑和一般資源調用
  • 詳談.net中的垃圾回收機制
  • asp.net中virtual和abstract的區別分析
  • ASP.NET實現將word文檔轉換成pdf的方法
  • ASP.NET配置文件Web.config用法詳解
  • ASP.net全局程序文件Global.asax用法分析

標簽:新疆 蘭州 江蘇 德陽 張家界 天門 白山 陽泉

巨人網絡通訊聲明:本文標題《.net非托管資源的回收方法》,本文關鍵詞  .net,非,托管,資源,的,回收,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《.net非托管資源的回收方法》相關的同類信息!
  • 本頁收集關于.net非托管資源的回收方法的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    高清不卡在线观看av| 欧美无砖专区一中文字| 国产精品一区二区果冻传媒| 精品黑人一区二区三区久久| 成人免费毛片a| 美女一区二区视频| 国产精品午夜在线| 精品国产污污免费网站入口| 日韩精品专区在线| 3atv在线一区二区三区| 欧美日韩的一区二区| 日韩女优电影在线观看| 精品欧美乱码久久久久久| 国产精品高清亚洲| 亚洲成a人片在线观看中文| 蜜桃精品视频在线| 色婷婷亚洲综合| 亚洲精品在线观| 国产精品色噜噜| 亚洲成人先锋电影| 国产一区二区三区免费观看| 亚洲精品久久久蜜桃| 欧美三级日韩三级| va亚洲va日韩不卡在线观看| 国产成人免费视| 亚洲综合自拍偷拍| 日韩中文字幕亚洲一区二区va在线| 精品久久人人做人人爰| 日本伊人色综合网| 欧美一区二区三区系列电影| 人禽交欧美网站| 久久久久高清精品| 成人丝袜视频网| thepron国产精品| 日韩午夜小视频| 亚洲区小说区图片区qvod| 91丨九色丨国产丨porny| 国产伦精品一区二区三区免费迷| 国产不卡高清在线观看视频| 91丝袜呻吟高潮美腿白嫩在线观看| 色综合久久中文综合久久97| 中文字幕乱码一区二区免费| 国产福利一区在线| 日韩精品一区二区三区在线播放| 色欧美日韩亚洲| 欧美性受xxxx黑人xyx性爽| 亚洲女同一区二区| 欧美亚洲免费在线一区| 亚洲综合免费观看高清完整版 | 男人的天堂亚洲一区| 成人国产精品免费| 亚洲人午夜精品天堂一二香蕉| 成人综合在线视频| 久久香蕉国产线看观看99| 精品亚洲成a人| 亚洲黄网站在线观看| 夜夜操天天操亚洲| 色综合久久六月婷婷中文字幕| 欧美在线观看18| 蜜臀va亚洲va欧美va天堂| 91黄色激情网站| 日本成人在线不卡视频| 国产精品你懂的| 亚洲精品乱码久久久久久| 欧美一级一区二区| 91成人免费网站| 国产精品一区二区在线观看网站| 欧美亚洲动漫另类| 奇米色一区二区| 国产精品嫩草影院com| 日韩欧美成人午夜| 欧美日韩免费观看一区二区三区 | 丁香婷婷综合五月| 国产网站一区二区| 一本到高清视频免费精品| 国产乱子伦视频一区二区三区 | 日韩av中文在线观看| 欧美精彩视频一区二区三区| 色婷婷综合五月| 91视视频在线观看入口直接观看www| 成人免费观看男女羞羞视频| 成人性视频网站| 日韩视频永久免费| 免费在线观看精品| 成人免费福利片| 一级做a爱片久久| 3751色影院一区二区三区| 欧美视频一区二区在线观看| 亚洲在线观看免费| 欧美一区二区三区性视频| 欧美性生活久久| 亚洲综合自拍偷拍| 欧美一三区三区四区免费在线看| 欧美日韩亚洲另类| 亚洲一区在线观看视频| 成人av电影观看| 亚洲与欧洲av电影| 亚洲男人的天堂在线aⅴ视频| 色综合久久88色综合天天免费| 欧美国产精品久久| 久久久欧美精品sm网站| 国产酒店精品激情| 色综合一个色综合亚洲| 寂寞少妇一区二区三区| 欧美日韩一级视频| 91亚洲精华国产精华精华液| 日韩激情在线观看| 99综合电影在线视频| 久久久久久久久免费| 亚洲欧美一区二区三区国产精品| 欧美人与禽zozo性伦| 久久精品视频网| 欧洲激情一区二区| 中文字幕 久热精品 视频在线 | 精品在线免费观看| 精品久久人人做人人爱| 成人爱爱电影网址| 亚洲第四色夜色| 久久久久久久久久久电影| 中国av一区二区三区| 欧美日韩亚洲综合在线| 国产成人精品一区二区三区四区 | 91高清视频免费看| 国产91高潮流白浆在线麻豆| 极品少妇一区二区三区精品视频 | 99久久久久免费精品国产| 夜夜亚洲天天久久| 中文字幕+乱码+中文字幕一区| 国产麻豆精品theporn| 色哟哟在线观看一区二区三区| 97se亚洲国产综合自在线| 成人av电影免费观看| 成人av电影免费观看| 国产福利一区二区三区| 欧美一级精品大片| 久久综合九色综合97婷婷女人 | 国内外精品视频| 亚洲国产综合人成综合网站| 亚洲美女淫视频| 一区二区三区在线观看国产| 一区在线观看视频| 久久久久久久精| 色综合天天综合| 中文字幕免费不卡| 国产精品灌醉下药二区| 一本一道久久a久久精品综合蜜臀| av在线不卡网| 欧美在线影院一区二区| 欧美一级在线免费| 亚洲高清免费一级二级三级| 蜜臀精品久久久久久蜜臀| 日本v片在线高清不卡在线观看| 成人欧美一区二区三区白人| 欧美一区二区三区爱爱| 精品999在线播放| 久久久精品综合| 宅男在线国产精品| 国产精品丝袜91| 丝袜美腿亚洲色图| 国产一区二区精品久久| 一本色道a无线码一区v| 欧美三级韩国三级日本一级| 制服丝袜亚洲色图| 日本一区二区三区国色天香| 亚洲欧美日韩久久精品| 麻豆成人av在线| 欧美在线观看一区| 日韩精品一区在线观看| 国产精品拍天天在线| 亚洲一区二区在线免费看| 91精品国产综合久久久久久久久久 | 欧美美女视频在线观看| 国产在线播放一区三区四| 极品销魂美女一区二区三区| 91视频精品在这里| 精品电影一区二区三区| 五月激情综合色| 99r精品视频| 日韩精品中文字幕在线不卡尤物| 亚洲国产成人私人影院tom| 日韩三级视频中文字幕| 91精品国产综合久久蜜臀| 777欧美精品| 亚洲三级久久久| 中文在线免费一区三区高中清不卡| 成人aaaa免费全部观看| 欧美一区中文字幕| 依依成人精品视频| 精品一区二区综合| 欧美三级视频在线观看| 国产精品水嫩水嫩| 欧美一卡二卡三卡| 五月天婷婷综合| 色婷婷亚洲精品| 中文子幕无线码一区tr| 国产成人精品三级| 国产成人精品免费一区二区| 视频一区二区三区中文字幕| 欧美色图天堂网| 亚洲h动漫在线|