-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 に答える