在同一进程中创建的所有其他线程结束后,停止一个线程

本文关键字:线程 一个 结束 其他 进程 创建 | 更新日期: 2023-09-27 18:09:03

我正在尝试编写一个任何进程都可以用于日志的库。我想在我的类中有一个专用的工作线程,通过某种机制(管道,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.");

messageQueue是一个ConcurrentQueue<Message>。我希望queueWriter总是停止十秒后,所有其他线程,我已经明确地创建在托管它的进程中,除了它自己死为了给它一些时间来完成写日志它在它的messageQueue,但不阻止进程关闭(所以十秒后,如果它还没有完成写所有的日志,我们不再关心,只是停止线程)。

指出:

  • queueWriter成为一个后台线程是不够好的。当父线程死亡时,我不想杀死queueWriter,因为它可能没有足够的时间完成写挂起的日志。
  • 订阅Process.GetCurrentProcess().Exited也不够好。queueWriter线程保持进程运行。
  • 我希望它可以作为一个库使用,我不希望开发人员在关闭他们的应用程序或进程的十秒钟后手动通知worker停止。我只是想能够跟踪除了工作线程以外的所有线程何时死亡,等待十秒钟,然后关闭工作线程。
  • .Threads
  • Process.GetCurrentProcess()。Count可能很方便,但是用它做一些测试,它会给你应用程序使用的所有线程(比如非托管线程、库线程,甚至是你没有显式创建的线程,也就是说你没有写代码来显式启动那些线程)。

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

在同一进程中创建的所有其他线程结束后,停止一个线程

对于线程不能这样做。你可以用一个单独的进程来完成。

您添加队列可能是因为网络可能很慢且不可靠。但是与同一台机器上的进程通信速度很快,快到可以同步通信。您还可以监视该进程,并在它死亡时启动一个新进程。