亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解C#中的定時器Timer類及其垃圾回收機制

 更新時間:2016年04月27日 10:32:37   作者:go,go  
這篇文章主要介紹了C#中的定時器Timer類及其垃圾回收機制,講解了Timer相關的單線程異步工作,需要的朋友可以參考下

關于C# Timer類  在C#里關于定時器類就有3個

C# Timer使用的方法1.定義在System.Windows.Forms里

C# Timer使用的方法2.定義在System.Threading.Timer類里  "

C# Timer使用的方法3.定義在System.Timers.Timer類里

下面我們來具體看看這3種C# Timer用法的解釋:

(1)System.Windows.Forms.Timer

應用于WinForm中的,它是通過Windows消息機制實現(xiàn)的,類似于VB或Delphi中的Timer控件,內(nèi)部使用API  SetTimer實現(xiàn)的。它的主要缺點是計時不精確,而且必須有消息循環(huán),Console  Application(控制臺應用程序)無法使用。  
 
(2)System.Timers.Timer

和System.Threading.Timer非常類似,它們是通過.NET  Thread  Pool實現(xiàn)的,輕量,計時精確,對應用程序、消息沒有特別的要求。

(3)System.Timers.Timer還可以應用于WinForm,完全取代上面的Timer控件。它們的缺點是不支持直接的拖放,需要手工編碼。

C# Timer用法實例

使用System.Timers.Timer類

System.Timers.Timer t =  
new System.Timers.Timer(10000); 
//實例化Timer類,設置間隔時間為10000毫秒;  
t.Elapsed +=  
new System.Timers.ElapsedEventHandler(theout); 
//到達時間的時候執(zhí)行事件;  
t.AutoReset = true; 
//設置是執(zhí)行一次(false)還是一直執(zhí)行(true);  
t.Enabled = true; 
//是否執(zhí)行System.Timers.Timer.Elapsed事件;  
 
public void theout( 
object source,  
System.Timers.ElapsedEventArgs e)  
 {  
  MessageBox.Show("OK!");  
 } 

 
Timer的垃圾回收機制
通常我們需要定時執(zhí)行一段任務的時候,我們就需要定時器,這時我們就可以使用c# System.Threading空間中的 Timer定時器;他是個異步定時器,時間到時每次都是在線程池中分配一個線程去執(zhí)行任務。下面我們來看一個有趣的例子:

class Program
  {
    static void Main(string[] args)
    {
      Timer timer = new Timer(TimerCallback,null,0,2000);
      
      Console.ReadLine();
    }
 
    private static void TimerCallback(object o)
    {
      Console.WriteLine("in TimerCallback method");
      GC.Collect();
 
      
    }
  }

當我們在debug模式下運行該段程序時,正如我們期盼的那樣程序會每隔2秒鐘執(zhí)行該方法,打印出"in TimerCallback method”,而在release模式下執(zhí)行的時候,只執(zhí)行一次該方法,字符串只打印一次。在這里我們在調(diào)用TimerCallback方法時,強制執(zhí)行垃圾回收器,說明在release模式下,垃圾回收器執(zhí)行回收算法時,首先假設所有對象都是可回收的,當將Timer對象賦值給變量t后,t沒有在被引用,因此也就沒有變量引用Timer對象,所以垃圾收集這時會回收Timer對象。那么為什么在debug模式下卻能夠運行能,這跟c#編譯器的優(yōu)化方式有關,在release模式下編譯器做了相關的優(yōu)化操作。而在debug模式下,timer對象的生成期是方法的結束,這樣做也是為了調(diào)試的方便。要不然在調(diào)試時,我們執(zhí)行到Timer timer = new Timer()后想看timer的值時,已經(jīng)被垃圾回收器給回收了,這是我們不期望看到的結果,編譯器如何處理的,我們可以看看編譯器在release模式下和debug模式下對上面的代碼編譯后生成的IL對比我們既知結果。

release模式編譯生成的IL:

.method private hidebysig static void Main(string[] args) cil managed
{
 .entrypoint
 // Code size    32 (0x20)
 .maxstack 8
 IL_0000: ldnull
 IL_0001: ldftn   void GCTest.Program::TimerCallback(object)
 IL_0007: newobj   instance void [mscorlib]System.Threading.TimerCallback::.ctor(object,
                                           native int)
 IL_000c: ldnull
 IL_000d: ldc.i4.0
 IL_000e: ldc.i4   0x7d0
 IL_0013: newobj   instance void [mscorlib]System.Threading.Timer::.ctor(class [mscorlib]System.Threading.TimerCallback,
                                       object,
                                       int32,
                                       int32)
 IL_0018: pop
 IL_0019: call    string [mscorlib]System.Console::ReadLine()
 IL_001e: pop
 IL_001f: ret
} // end of method Program::Main

debug模式下生成的IL:

method private hidebysig static void Main(string[] args) cil managed
{
 .entrypoint
 // Code size    33 (0x21)
 .maxstack 4
 .locals init ([0] class [mscorlib]System.Threading.Timer timer)
 IL_0000: nop
 IL_0001: ldnull
 IL_0002: ldftn   void GCTest.Program::TimerCallback(object)
 IL_0008: newobj   instance void [mscorlib]System.Threading.TimerCallback::.ctor(object,
                                           native int)
 IL_000d: ldnull
 IL_000e: ldc.i4.0
 IL_000f: ldc.i4   0x7d0
 IL_0014: newobj   instance void [mscorlib]System.Threading.Timer::.ctor(class [mscorlib]System.Threading.TimerCallback,
                                       object,
                                       int32,
                                       int32)
 IL_0019: stloc.0
 IL_001a: call    string [mscorlib]System.Console::ReadLine()
 IL_001f: pop
 IL_0020: ret
} // end of method Program::Main

從生成的IL中我們可以看出在debug模式下,生成IL比在release模式下多了19行紅色字體的IL指令碼,該指令碼的作用是將15行生成的引用Timer對象的棧上的變量存放到局部變量0中。所以使得在debug模式下該t還被引用,不能夠回收Timer對象,所以也能出現(xiàn)我們期盼的結果,那么如何在兩種模式下都能得到我們期盼的結果呢。我們可以如下操作。

正確的代碼:

class Program
  {
    static void Main(string[] args)
    {
      Timer timer = new Timer(TimerCallback,null,0,2000);
    
      Console.ReadLine();
      timer.Dispose();
    }

    private static void TimerCallback(object o)
    {
      Console.WriteLine("in TimerCallback method");

      GC.Collect();

      
    }
  }

這時不管是在release模式下還是debug模式下,都會每隔2秒鐘調(diào)用我們的回調(diào)方法。

相關文章

  • C#中List用法介紹詳解

    C#中List用法介紹詳解

    本文詳細講解了C#中List用法介紹,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • C#圖像處理之木刻效果實現(xiàn)方法

    C#圖像處理之木刻效果實現(xiàn)方法

    這篇文章主要介紹了C#圖像處理之木刻效果實現(xiàn)方法,可實現(xiàn)類似木刻效果的黑白照效果,需要的朋友可以參考下
    2015-04-04
  • C#正則表達式Regex用法詳解

    C#正則表達式Regex用法詳解

    本文詳細講解了C#正則表達式Regex的用法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • 說說C#的async和await的具體用法

    說說C#的async和await的具體用法

    本篇文章主要介紹了說說C#的async和await的具體用法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • 淺析C#中結構與類的區(qū)別

    淺析C#中結構與類的區(qū)別

    本文主要對C#結構與類的區(qū)別進行簡要分析,文中舉了實例,便于理解,具有很好的參考價值,需要的朋友一起來看下吧
    2016-12-12
  • C#動態(tài)查詢之巧用Expression組合多條件表達式的方法和步驟

    C#動態(tài)查詢之巧用Expression組合多條件表達式的方法和步驟

    在C#中,可以使用AndAlso和OrElse方法組合兩個Expression<Func<T, bool>>類型的表達式,下面通過實例代碼給大家分享C#動態(tài)查詢之巧用Expression組合多條件表達式,感興趣的朋友跟隨小編一起看看吧
    2024-05-05
  • C#基于Socket套接字的網(wǎng)絡通信封裝

    C#基于Socket套接字的網(wǎng)絡通信封裝

    這篇文章主要為大家詳細介紹了C#基于Socket套接字的網(wǎng)絡通信封裝本文實例為大家分享了Java實現(xiàn)圖片旋轉的具體代碼,供大家參考,具體內(nèi)容如下
    2021-11-11
  • C#通過rabbitmq實現(xiàn)定時任務(延時隊列)

    C#通過rabbitmq實現(xiàn)定時任務(延時隊列)

    工作中經(jīng)常會有定時任務的需求,常見的做法可以使用Timer、Quartz、Hangfire等組件,本文使用C#通過rabbitmq實現(xiàn)定時任務(延時隊列),感興趣的可以了解一下
    2021-05-05
  • 詳解如何使用C#獲取計算機信息

    詳解如何使用C#獲取計算機信息

    這篇文章主要為大家詳細介紹了如何使用C#實現(xiàn)獲取計算機信息,文中的示例代碼講解詳細,具有一定的借鑒價值,有需要的小伙伴可以參考下
    2024-10-10
  • 利用C#實現(xiàn)分割GIF圖片

    利用C#實現(xiàn)分割GIF圖片

    這篇文章主要為大家詳細介紹了如何利用C#實現(xiàn)分割GIF圖片的功能,文中的示例代碼講解詳細,對我們學習C#有一定的幫助,感興趣的小伙伴可以了解一下
    2022-12-12

最新評論