2012-06-22 60 views
-1

如何開始在新線程中運行包含計時器的對象?如何在新線程中啓動包含計時器的對象?

我有下面的代碼,我應該改變它:

class MemoryCleaner : IDisposable 
    { 
     private readonly static MemoryCleaner Instance = new MemoryCleaner(); 

     private readonly Timer _memoryWatcher = new Timer(15 * 1000); 

     public Timer MemoryWatcher 
     { 
      get 
      { 
       return this._memoryWatcher; 
      } 
     } 

     public void Dispose() 
     { 
      _memoryWatcher.Elapsed -= memoryWatcher_Elapsed; 
      this._memoryWatcher.Stop(); 
     } 

     private void memoryWatcher_Elapsed(object sender, ElapsedEventArgs e) 
     { 
      var currentProcess = Process.GetCurrentProcess(); 
      var megaBytes = currentProcess.PrivateMemorySize64/(1024 * 1024); 
      if (megaBytes > 100) 
      { 
       // force an immediate garbage collection to free some unused memory quickly; this is an expensive process! 
       GC.Collect(); 
      } 
     } 

     internal static void Start() 
     { 
      // this should be created in a new thread 
      Instance.MemoryWatcher.Elapsed += Instance.memoryWatcher_Elapsed; 
      Instance.MemoryWatcher.Start(); 
      GC.KeepAlive(Instance); 
     } 

     internal static void Stop() 
     { 
Instance.Dispose(); 
     } 
    } 

我想用它喜歡:

MemoryCleaner.Start(); 
// my memory thirsty code which generates so much garbage, e.g. downloads a document then disposes it. 
MemoryCleaner.Stop(); 

它應該做的是,我應該創建一個新的然後在該線程上創建一個新的MemoryCleaner對象實例並啓動該對象。

這怎麼可能做到這一點?

一些背景信息: 基本上,代碼應該做的是每15秒檢查一次主進程使用的內存,如果內存使用量超過100MB,將強制垃圾回收,因爲會創建很多垃圾。

希望問題清楚。

感謝,

+3

如果你的應用程序真正使用> 100MB,每隔15秒強制一次GC只會使事情變得更糟,因爲**將100MB分頁保存在**中,這與你想要的相反(允許操作系統在不用於釋放物理RAM)。 –

+0

您不'運行'或'啓動'一個對象。 –

+0

收集超過100MB的垃圾,使GC保持100MB的頁面?你什麼意思? –

回答

0

如果您要創建一個System.Threading.TimerSystem.Timers.Timer它並沒有多少事情你創建的線程它 - 除非你指定一個同步對象,計時器會觸發一個線程池中的線程反正。你爲什麼要爲創建部分創建一個線程?

(我不能肯定這一切是個好主意,無論如何,但這是另外一個問題......你也應該考慮是否做一個單身落實執行IDisposable是真懂事。)

+0

謝謝喬恩。我希望它在單獨的線程上運行的原因是,我的代碼中無法運行。我不知道爲什麼。我嘗試了一個簡單的應用程序,但無法重現問題,時間過得很好。不知道是什麼原因導致我的prod應用程序停止工作。 –

+0

@TheLight:我會專注於診斷差異,而不是僅僅將某些東西放在不同的線程上。 –

+0

我的應用程序使用沉重的多線程,因此如果我可以在單獨的線程上完全運行MemoryCleaner(不會與任何其他代碼共享),那麼它應該可以解決問題。我認爲原因在於,當計時器消逝時,它會等待直到線程池至少有一個可用線程,以便它找不到它並等待直到再次變爲可用線程。 –

相關問題