如何開始在新線程中運行包含計時器的對象?如何在新線程中啓動包含計時器的對象?
我有下面的代碼,我應該改變它:
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,將強制垃圾回收,因爲會創建很多垃圾。
希望問題清楚。
感謝,
如果你的應用程序真正使用> 100MB,每隔15秒強制一次GC只會使事情變得更糟,因爲**將100MB分頁保存在**中,這與你想要的相反(允許操作系統在不用於釋放物理RAM)。 –
您不'運行'或'啓動'一個對象。 –
收集超過100MB的垃圾,使GC保持100MB的頁面?你什麼意思? –