我正在尝试编写任何进程可用于记录的库。我想在我的类中有一个专用的工作线程,它通过某种机制(管道,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
线程保持了进程。那怎么办呢?它甚至可能吗?
答案 0 :(得分:1)
你不能用线程来做这件事。你可以通过一个单独的过程来完成它。
据推测,您添加队列是因为网络速度慢且不可靠。但是,在同一台机器上与进程通信的速度快,速度快,可以同步进行通信。你可以监控这个过程,并在它死亡时启动一个新过程。