C# .Net运行时错误停止服务;未处理的IOException
我负责更新一项服务,该服务读取文本文件,从文本文件的各个部分创建pdf文件,并通过电子邮件发送pdf文件。我最近对服务做了一些更改,并使用了.NET4.0框架。在服务器上更新时,4.0框架是在我移动文件并成功启动服务之前安装的-它以前使用的是2.0。该服务将一直运行,直到到达试图用pdf文件清理目录的代码为止。当代码试图删除“被另一进程使用”的pdf文件时,服务停止。代码查找此异常,并应等待约30秒,然后重试删除。在本地,我通过一个测试工具运行这个服务,它循环运行,直到文件可以删除为止(平均需要5分钟),但在服务器上,服务停止,并在应用程序事件日志中找到未处理的IOException。我不明白为什么它会继续在本地处理,而不是在服务器上。如有任何想法或其他信息,将不胜感激 以下是事件日志中的错误: 由于未处理的异常,进程已终止 异常信息:System.IO.IOException 堆栈: 在System.IO.\uuu Error.WinIOError(Int32,System.String) 在System.Console.GetBufferInfo(布尔,布尔ByRef) 位于processorName.FileProcessingThread.CleanUpDirectory(System.Object) 位于System.Threading.ThreadHelper.ThreadStart\u上下文(System.Object) 在System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext,System.Threading.ContextCallback,System.Object,布尔值) 在System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext,System.Threading.ContextCallback,System.Object)上运行 位于System.Threading.ThreadHelper.ThreadStart(System.Object) 此错误也会出现在事件日志中: 事件类型clr20r3、P1 myServiceName.exe、P2 1.0.1.0、P3 4db6e85d、P4 mscorlib、P5 4.0.0.0、P6 4d53693b、P7 3dab、P8 23b、P9 system.io.ioexception、P10 NIL 下面是处理异常的代码,请等待并重试删除文件C# .Net运行时错误停止服务;未处理的IOException,c#,.net,windows-services,C#,.net,Windows Services,我负责更新一项服务,该服务读取文本文件,从文本文件的各个部分创建pdf文件,并通过电子邮件发送pdf文件。我最近对服务做了一些更改,并使用了.NET4.0框架。在服务器上更新时,4.0框架是在我移动文件并成功启动服务之前安装的-它以前使用的是2.0。该服务将一直运行,直到到达试图用pdf文件清理目录的代码为止。当代码试图删除“被另一进程使用”的pdf文件时,服务停止。代码查找此异常,并应等待约30秒,然后重试删除。在本地,我通过一个测试工具运行这个服务,它循环运行,直到文件可以删除为止(平均需要
while (!isDone)
{
bool myRetVal = true;
string myErrorMsg = String.Empty;
string myFile = String.Empty;
//give it time to finish processing
Thread.Sleep(30 * 1000);
//
//delete Files in folder
foreach (string file in Directory.GetFiles(myDirectory, "*.PDF"))
{ //delete all the *.PDF files
try
{
File.Delete(file);
}
catch (Exception ex)
{
myErrorMsg = "...\r\n" + ex.Message;
m_Log.Writeline("Unable to delete "+ file + ". MESSAGE:"+ myErrorMsg,3);
myFile = file;
myRetVal = false;
}
}
//
//now move the in-progress File to the processed directory
if (myRetVal)
{
foreach (string file in Directory.GetFiles(myDirectory, "*.InProgress"))
{
try
{
if (File.Exists(m_ConfigFile.ProcessedFolderName + Path.GetFileNameWithoutExtension(file) + ".done"))
{
File.Delete(file);
}
else
{
File.Move(file, m_ConfigFile.ProcessedFolderName + Path.GetFileNameWithoutExtension(file) + ".done");
}
}
catch (Exception ex)
{
if (ex.Message.Contains("file already exists"))
{
}
else
{
myErrorMsg = "...\r\n" + ex.Message;
myFile = file;
myRetVal = false;
}
}
}
}
//
//if empty, delete the SendMailFolder subfolder
if (myRetVal)
{
try
{
if (Directory.GetFiles(myDirectory, "*.*").Length == 0) Directory.Delete(myDirectory);
}
catch (Exception ex)
{
myErrorMsg = "...\r\n" + ex.Message;
myFile = myDirectory;
myRetVal = false;
}
}
if (Console.CursorLeft > 0) Console.WriteLine("\r\n");
if (myRetVal)
{
Console.WriteLine(DateTime.Now.ToLocalTime() + " CleanUp SendMailFolder...Done");
isDone = true;
}
else
{
if (myErrorMsg.Contains("is being used by another process."))
{
myErrorMsg = " is still in use.";
Console.WriteLine(DateTime.Now.ToLocalTime() + " CleanUp SendMailFolder..." + Path.GetFileName(myFile) + myErrorMsg);
}
else
{
Console.WriteLine(DateTime.Now.ToLocalTime() + " CleanUp SendMailFolder..." + Path.GetFileName(myFile) + myErrorMsg);
m_Log.Writeline(DateTime.Now.ToLocalTime() + " CleanUp SendMailFolder..." + Path.GetFileName(myFile) + myErrorMsg, 3);
isDone = true;
}
}
}
看起来在您尝试捕获之前发生了错误。假设您应该通过日志记录看到特定的消息输出(我假设它会进入事件日志)。我没有看到与您的日志中的内容类似的消息。您可能需要一个应用程序域异常处理程序来捕获任何异常并记录它们。您正在尝试在服务中使用Console类,该服务没有与之关联的Console窗口。您应该使用某种替代形式的日志记录,而不是假设存在控制台窗口。例如,log4net允许您配置多个“appender”,例如控制台、文件和事件日志appender,以便同时使用(如果它们不合适,将忽略它们) 编辑以澄清:
如果绝对需要,可以使用
alloconsole
p/Invoke调用手动创建控制台窗口。默认情况下,服务不会与桌面交互,因此创建控制台窗口不是一个好主意。为此,您需要在启用“允许服务与桌面交互”设置的情况下配置服务。这会带来安全问题,特别是对于有多个用户的机器,因此我建议不要这样做。您还应该确保您的m_日志例程具有正确的错误处理,因为这可能也是罪魁祸首。代码中的日志记录是对一个文件或控制台进行的(通过我的线束在本地测试时可以看到). 日志和目录内容表明,pdf文件将被删除,直到代码到达仍在使用中的文件为止(我不知道是通过什么过程使用的)因此,有一些文件从目录中删除,而主txt文件仍然存在,扩展名为.InProgress,这意味着它永远不会移动到处理过的目录中。如果它超出了我的try-catch,那么我在本地测试时不应该得到异常吗?不确定。如果该目录在服务器上不存在,则其他内容可能会失败并引发IOException。这就是为什么我认为您看到了代码之外的东西。这是导致错误的原因吗?我也不明白为什么它是用控制台之类的东西写的,我认为它没有必要,因为一些登录服务的人已经写入了日志文件。+1。请注意异常跟踪:位于System.Console.GetBufferInfo(Boolean,Boolean ByRef)
使用控制台导致问题,而不是与文件交互。我将删除或更改对Console.CursorLeft
和Console.WriteLine