2015-04-17 56 views
0

前段時間我一直在研究c#應用程序,所以我不得不使用定時器。現在我正要將這個應用程序從控制檯更改爲Windows服務。我嘗試優化我的代碼,確保它能夠作爲服務工作。所以計時器...C#定時器和內存

這是非常如何我有我的定時器現在宣佈:

firstTimer = new System.Timers.Timer(5000); 
firstTimer.Elapsed += FirstEvent; 
firstTimer.Enabled = false; 

我可以在這裏看到https://msdn.microsoft.com/en-us/library/zb0225y6%28v=vs.110%29.aspx的是T類實現了IDisposable這樣我就可以調用Dispose(),並希望一切會是okey?我的班級裏有3個計時器。如果我只是調用Dispose()上的每個定時器有或實現IDisposable上我的課,並定義Dispode方法是這樣的:

public void Dispose() 
     { 
      firstTimer.Elapsed -= FirstEvent; 
      secondTimer.Elapsed -= SecondEvent; 
      thirdTimer.Elapsed -= ThirdEvent; 

      firstTimer.Dispose(); 
      secondTimer.Dispose(); 
      thirdTimer.Dispose(); 

      this.Dispose(); 
     } 

或者是這個壞的做法?我甚至需要這樣做firstTimer.Elapsed -= FirstEvent;?或者定時器在-=後自動處理?

由於我在我的課上實現了IDisposable,所以我認爲使用using塊是正確的。

static void Main(string[] args) 
{ 
    using (Myclass mc = new Myclass()) 
    { 
     mc.init(); 
    } 
} 

init方法是我的計時器聲明和所有相關的東西。

總結我的問題。這種方法是否正確?我能添加一些東西嗎?也許我所做的是愚蠢的?關於配置定時器還有很多其他的話題,但我無法從中得到答案。

感謝您的洞察力。

回答

1

Dispose方法應該是這樣的:

public void Dispose() 
{ 
    firstTimer.Dispose(); 
    secondTimer.Dispose(); 
    thirdTimer.Dispose(); 
} 

遞歸調用this.Dispose()當然是一個非常糟糕的主意。不需要刪除事件處理程序。


或者你也可以實現實現在this article描述終結~ClassNameDisposeDispose(bool)更復雜的(而且往往不是必要的)方式。但主要是如果您同時使用託管和非託管資源。

+0

*遞歸調用this.Dispose()*當然不是一個壞主意;它肯定會導致'StackOverFlowException'。我不會說這是個壞主意;糟糕的想法是我們說它什麼時候會起作用,但它不好。在這種情況下,它甚至不會工作。 –