C# 在所有其他线程I'之后停止一个线程;我们在同一个过程中创建了模具

C# 在所有其他线程I'之后停止一个线程;我们在同一个过程中创建了模具,c#,.net,windows,multithreading,process,C#,.net,Windows,Multithreading,Process,我正在尝试编写一个任何进程都可以用于日志记录的库。我希望在我的类中有一个专用的工作线程,它通过某种机制(管道、TCP套接字等)将日志消息写入远程机器上的另一个进程,因此日志构造函数的代码如下所示(这样做的原因是,当远程计算机上的日志服务器关闭时,您不会阻止正在日志记录的线程停止其执行): 因此,如果您有一个应用程序,您可以这样记录: LogWriter logWriter = new LogWriter(); logWriter.Debug("This is an example of how

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

因此,如果您有一个应用程序,您可以这样记录:

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
。我希望
queueWriter
在托管它的进程中显式创建的所有其他线程(除了它本身)死亡后,总是在十秒钟内停止,以便给它一些时间来完成它在
messageQueue
中的日志写入,而不是停止阻止进程关闭(因此,十秒钟后,如果它还没有完成所有日志的写入,我们不再关心,只需停止线程)

注:

  • 使
    queueWriter
    成为后台线程还不够好。我不想在父线程死亡时杀死
    queueWriter
    ,因为它可能没有足够的时间完成其挂起日志的写入
  • 订阅
    Process.GetCurrentProcess().Exited
    也不够好。
    queueWriter
    线程保持进程正常运行
  • 我希望它可以作为一个库使用,我不希望开发人员在应用程序或进程关闭10秒后手动通知工作线程停止。我只希望能够跟踪除工作线程之外的所有线程何时都已停止,等待10秒,然后关闭工作线程
  • Process.GetCurrentProcess().Threads.Count可能很方便,但是使用它进行一些测试,它会为您提供应用程序使用的所有线程(例如非托管线程、库线程,甚至是您自己没有显式创建的线程,因为您没有编写显式启动该线程的代码)

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

你不能用线程来实现这一点。不过,你可以用单独的进程来实现


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

我不认为您可以使用线程来完成此操作。不过,您可以使用单独的进程。大多数情况下我完全不可能。你真的没有办法知道进程中的每个线程都做了什么,所以即使你列举了每个线程,也总有可能主机进程做出了你无法确定的安排。@Jon不是进程中的每个线程,只是库本身创建的每个线程,如果我读对了问题的话@zespri:它说“但不阻止进程关闭”——我把它理解为“我想知道进程何时退出,这样我就可以对线程倒计时”.@KrisVandermotten我想你是对的。我想得越多,有第二个本地进程来处理这个问题就越有意义。如果这个进程还没有启动,库可以启动它,甚至可以订阅它,这样它就有一个调用它的进程列表,这样它就可以在完成后关闭自己在所有原始调用过程结束后编写其所有日志。是的,我想就是这样。除非有人有更好的解决方案来获取您显式创建的线程数,否则这可能是唯一的方法,即使有其警告。唯一的另一种选择是承认日志记录是在尽最大努力的基础上进行的。即使是持久化如果在事务提交之前断电,事务队列就不能保证消息的传递。如果这是尽最大努力的事情,后台线程可能是可以接受的。这当然会更容易。
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.");