我们的计划似乎要持续数小时,尽管最终会完成。 我们看到这一点是因为文件修改日期有时比预期的晚几个小时。
我们的程序PROCESS.EXE采用IN.TXT并在完成时写入LOG.TXT(名称已更改以保护有罪)。这个PROCESS.EXE是从BAT文件的小时开始从Windows调度程序运行的,当我们尝试从控制台运行时,行为没有发生。
要编写LOG.TXT,PROCESS.EXE使用以下方法:
public static string WriteLogToFile(string message, string filename)
{
try
{
string dirPath = LogFolderPhysicalPath;
if (!Directory.Exists(dirPath)) Directory.CreateDirectory(dirPath).Create();
var filePath = string.Format("{0}{1}.log.txt", dirPath, filename);
if (!File.Exists(filePath))
{
File.Create(filePath).Dispose();
}
using (var w = File.AppendText(filePath))
{
w.WriteLine(message);
w.Close();
}
return filePath;
}
catch (Exception ex)
{
Console.WriteLine("Critical exception in logger: " + ex.Message);
return string.Empty;
}
}
运行后,LOG.TXT中的最后一行也是:
文件在0小时内处理2分钟和57秒。
IN.TXT修改时间是06:55,所以我们期望PROCESS.EXE根据上面的经过时间在06:58左右完成。
然而,LOG.TXT的模具日期是三小时后的09:58。并且看起来PROCESS.EXE实际上与其他标志挂起的时间很长。
这种行为不稳定。我们的流程每小时运行一次,并且总是报告2-5分钟的流逝时间。 LOG.TXT修改日期通常是IN.TXT修改日期后的几分钟。但有好几次,就像上面的例子一样,已经过了1-3个小时了。
还有一件事,从PROCESS.EXE中调用logger方法:
var timeTaken = (DateTime.Now - startTime);
AppHelper.WriteLogToFile(
string.Format("File processed in {0} hour(s) {1} minute(s) and {2} seconds.",
timeTaken.Hours, timeTaken.Minutes, timeTaken.Seconds),
Path.GetFileNameWithoutExtension(file));
因为在调用此方法之前立即计算了经过的时间,所以我不认为任何干预可能导致PROCESS.exe挂起。什么可能导致这种长时间的延迟?
LOG.TXT文件名实际上是从IN.TXT文件的名称创建的,该文件是一个长名称,其中嵌入了时间戳以使其唯一。因此,我们实际上并没有写入" LOG.TXT",更像是" 201710050655.log"。
这是在Windows Server 2012R2上运行。