我有一个将消息记录到数据库(或其他地方)的 Windows 服务项目。这些消息的频率可能高达每秒十个。由于发送和处理消息不应该延迟服务的主进程,因此我启动了一个新线程来处理每条消息。这意味着如果主进程需要发送 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();
}
}
}
现在我主要担心的是,如果这项服务运行一个月,它仍然会在列表中包含所有线程(数百万)(其中大部分都死了)。这会吃掉内存,我不知道有多少。总的来说,这对我来说似乎不是一个好习惯,我想清理完成的线程,但我不知道该怎么做。有没有人对此有好的或最佳实践?