メッセージをデータベース (または他の場所) に記録する Windows サービス プロジェクトがあります。これらのメッセージの頻度は、1 秒あたり最大 10 になる可能性があります。メッセージの送信と処理によってサービスのメイン プロセスが遅延することはないため、すべてのメッセージを処理するために新しいスレッドを開始します。これは、メイン プロセスが 100 個のログ メッセージを送信する必要がある場合、各メッセージを処理する 100 個のスレッドが開始されることを意味します。スレッドが終了すると、スレッドがクリーンアップされるため、破棄する必要がないことを学びました。スレッド内のすべての使用済みオブジェクトを破棄する限り、すべてが正常に機能するはずです。
サービスは、サービスのシャットダウンにつながる例外に入る可能性があります。サービスがシャットダウンする前に、メッセージを記録していたすべてのスレッドを待機する必要があります。これを実現するために、スレッドが開始されるたびにスレッドをリストに追加します。wait-for-threads メソッドが呼び出されると、リスト内のすべてのスレッドがまだ生きているかどうかがチェックされ、生きている場合は join を使用して待機します。
コード:
スレッドの作成:
/// <summary>
/// Creates a new thread and sends the message
/// </summary>
/// <param name="logMessage"></param>
private static void ThreadSend(IMessage logMessage)
{
ParameterizedThreadStart threadStart = new ParameterizedThreadStart(MessageHandler.HandleMessage);
Thread messageThread = new Thread(threadStart);
messageThread.Name = "LogMessageThread";
messageThread.Start(logMessage);
threads.Add(messageThread);
}
スレッドが終了するのを待っています:
/// <summary>
/// Waits for threads that are still being processed
/// </summary>
public static void WaitForThreads()
{
int i = 0;
foreach (Thread thread in threads)
{
i++;
if (thread.IsAlive)
{
Debug.Print("waiting for {0} - {1} to end...", thread.Name, i);
thread.Join();
}
}
}
今、私の主な懸念は、このサービスが 1 か月間実行された場合でも、リストにすべてのスレッド (数百万) が残っていることです (ほとんどのスレッドが停止しています)。これはメモリを消費しますが、どれだけかわかりません。これは全体として私にとって良い習慣ではないようです。完成したスレッドをクリーンアップしたいのですが、その方法がわかりません。これには良い方法やベストプラクティスがありますか?