我在c#中编写自己的记录器。当我在多线程中使用这个记录器时,我遇到了一些问题。它接缝每个线程有不同的时间。记录信息的方法仅针对一个线程锁定,并且文件消息的顺序正确,但是一些时间戳显示某些消息应该在某些消息之前,但是对于100%我确定订单是正确的,时间戳不是。 这是方法:
private void WriteToFile(string message, string label)
{
lock (this.semaphore)
{
var msgLines = message.Split('\n');
var timeStamp = string.Format("[{0}]", DateTime.Now.ToString("yyyy:MM:dd:HH:mm:ffff"));
foreach (var line in msgLines)
{
if (string.IsNullOrEmpty(line))
{
continue;
}
var msg = string.Concat(timeStamp, this.groupIndicator, label, line).Trim();
this.writer.WriteLine(msg);
}
}
}
其中semaphote的类型是object,writer是StreamWriter 还有输出:
[2016:11:15:13:06:2896]---> [MESSAGE] Test message <- one thread
[2016:11:15:13:06:2973]---> [MESSAGE] Test message <- one thread
[2016:11:15:13:06:3033]---> [MESSAGE] Test message <- one thread
[2016:11:15:13:06:1956]---> [MESSAGE] Different message <- different thread
我100%确定邮件的顺序正确,但随着时间的推移会发生一些奇怪的事情。 当我在方法WriteToFile之前添加时间戳时发生奇怪的事情。时间完全一样!
[2016:11:15:15:41:8828]---> [MESSAGE] time: 2016:11:15:15:41:8828, Test message <- one thread
[2016:11:15:15:41:9064]---> [MESSAGE] time: 2016:11:15:15:41:9064, Test message <- one thread
[2016:11:15:15:41:2515]---> [MESSAGE] time: 2016:11:15:15:41:2515, Different message <- different thread
我正在寻找其他方法来获取当前时间,但也要根据堆栈溢出DateTime.Now应该是正确的。
答案 0 :(得分:0)
回答这个问题很容易。 :&gt; 问题在于:DateTime.Now.ToString(“yyyy:MM:dd:HH:mm:ffff”)),这种格式没有秒。我花了一秒钟,实际上是几分钟。