2012-08-13 79 views
3

我有這種擴展方法可以在給定間隔後禁用定時器。是否有保證GC不會銷燬disableTimer變量(這是本方法中的局部變量)?或者是否有理由說明爲什麼此代碼將在一小時後運行。保證GC不會影響代碼

timer.DisableAfter(1.Hours()) : 

    public static void DisableAfter(this Timer timer, TimeSpan timeSpan) 
    { 
     var disableTimer = new Timer(timeSpan.TotalMilliseconds) 
      { 
       AutoReset = false, 
      }; 

     disableTimer.Elapsed += (sender, e) => 
      { 
       timer.Stop(); 
       disableTimer.Stop(); 
      }; 
     disableTimer.Start(); 
    } 
+0

disableTimer可能會在您到達1小時的時間間隔之前消失。你不能依賴它,甚至在方法完成後不會一秒鐘。 – 2012-08-13 06:13:13

回答

1

有沒有garauntee它會被垃圾收集或沒有,但如果你沒有一個參考保持到定時器這當然有資格領取。

看到這個MSDN頁面的定時器,下去到第一個示例源代碼塊,閱讀上面的文本,顯然源代碼塊本身......它實際上都是關於定時器的垃圾收集。

http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx

+0

非常感謝,非常感謝。 – user1025852 2012-08-13 06:31:35

0

我還有一個建議。它更簡單,因爲它不涉及另一個計時器。 當你在Elapsed方法上註冊一個處理程序時,用另一個處理程序包裝它,該處理程序將保存上次定時器啓動的時間。當計時器過去時,您首先檢查是否已經過了一個小時,如果是這樣,您抑制當前執行並取消計時器。

您可以通過Elapsed委託的源參數訪問計時器對象本身。

+0

謝謝,我不確定我是否完全瞭解你的想法 - 我會盡力實現它);) – user1025852 2012-08-13 06:31:17