gpt4 book ai didi

c# - 在我在同一进程中创建的所有其他线程死亡后停止线程

转载 作者:可可西里 更新时间:2023-11-01 10:36:23 25 4
gpt4 key购买 nike

我正在尝试编写一个任何进程都可以用于日志记录的库。我想在我的类中有一个专用的工作线程,它通过某种机制(管道、TCP 套接字等)将日志消息写入远程机器上的另一个进程,以便日志构造函数的代码看起来像这样(这样做的原因)这样一来,如果日志服务器在远程计算机上关闭,您就不会阻止正在日志记录的线程停止执行):

public LogWriter()
{
queueWriter = new Thread(() =>
{
while (messageQueued.WaitOne())
{
Message message;
while (messageQueue.TryDequeue(out message))
{
bool successful = false;
while (!successful)
{
try
{
_logger.PostMessage(message);
successful = true;
}
catch
{
try
{
_logger = new Logger();
}
catch { }
}
}
}
}
});
queueWriter.Start();
}

所以如果你有一个应用程序,你可以像这样记录:

LogWriter logWriter = new LogWriter();
logWriter.Debug("This is an example of how you'd send a debug log to the writer. This message would get translated into a Message object, queued up, and the dedicated writer would be signaled to start writing queued messages.");

messageQueueConcurrentQueue<Message> .我要queueWriter始终停止十秒在我在托管它的进程中明确创建的所有其他线程之后,除了它自己死掉,以便给它一些时间来完成它在其 messageQueue 中的日志的写入。 ,但不阻止进程关闭(所以十秒后,如果它还没有完成所有日志的写入,我们不再关心,只需停止线程)。

注意事项:

  • 制作queueWriter后台线程不够好。我不想杀queueWriter当父线程死亡时,因为它可能没有足够的时间来完成其待处理日志的写入。
  • 订阅Process.GetCurrentProcess().Exited也不够好。 queueWriter线程使进程保持运行。
  • 我希望它可以用作库,并且我不希望开发人员必须在应用程序或进程关闭 10 秒后手动向工作人员发出停止信号。我只是想能够跟踪到除了工作线程之外的所有线程都死了,等待十秒钟,然后关闭工作线程。
  • Process.GetCurrentProcess().Threads.Count 可能很方便,但是用它做一些测试,它会为您提供应用程序使用的所有线程(例如非托管线程、库线程,甚至是您未显式创建的线程)你自己,从某种意义上说,你还没有编写代码来显式启动该线程)。

那么如何做到这一点呢?有可能吗?

最佳答案

你不能用线程来做到这一点。不过,您可以使用单独的流程来完成。

您添加队列的原因可能是网络速度慢且不可靠。但是与同一台机器上的进程通信很快,快到足以同步通信。您可以监控进程,如果它死了就启动一个新进程。

关于c# - 在我在同一进程中创建的所有其他线程死亡后停止线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24251153/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com