在我在同一进程中创建的所有其他线程之后停止线程

时间:2014-06-16 19:53:06

标签: c# .net windows multithreading process

我正在尝试编写任何进程可用于记录的库。我想在我的类中有一个专用的工作线程,它通过某种机制(管道,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线程保持了进程。
  • 我希望它可以用作库,而且我不希望开发人员在关闭其应用程序或进程十秒钟后手动发信号通知工作人员停止。我只是希望能够跟踪除工作线程之外的所有线程何时死亡,等待十秒钟,然后关闭工作线程。
  • Process.GetCurrentProcess()。Threads.Count可能很方便,但是用它做一些测试,它会为你提供应用程序使用的所有线程(比如非托管线程,库线程,甚至是你没有的线程)明确地创建了自己,因为你没有编写代码来明确地启动该线程。)

那怎么办呢?它甚至可能吗?

1 个答案:

答案 0 :(得分:1)

你不能用线程来做这件事。你可以通过一个单独的过程来完成它。

据推测,您添加队列是因为网络速度慢且不可靠。但是,在同一台机器上与进程通信的速度快,速度快,可以同步进行通信。你可以监控这个过程,并在它死亡时启动一个新过程。