-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,则强制进行垃圾收集,因为会创建这么多垃圾。

希望问题很清楚。

谢谢,

4

1 回答 1

0

如果您正在创建一个System.Threading.Timer,或者System.Timers.Timer在哪个线程上创建它并不重要 - 除非您指定一个同步对象,否则计时器无论如何都会在线程池线程上触发。为什么要为创建部分创建一个线程?

(无论如何我都不确定所有这些都是一个好主意,但这是另一回事......您还应该考虑制作单例实现IDisposable是否真的很明智。)

于 2012-06-22T16:56:09.553 回答