【发布时间】:2012-06-22 16:49:22
【问题描述】:
如何在新线程中开始运行包含计时器的对象?
我有以下代码,我可能应该更改它:
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 的分页?你什么意思?
标签: c# multithreading timer garbage-collection