2011-05-05 70 views
1

我已經負責更新讀取文本文件的服務,並從文本文件的各個部分創建pdf文件並通過電子郵件發送PDF。我最近對服務進行了一些更改,並使用了.NET 4.0 Framework。在服務器上進行更新時,在安裝4.0 Framework之前,我可以移動文件併成功啓動服務 - 以前使用的是2.0。該服務運行,直到它到達試圖用pdf文件清理目錄的代碼。該服務在代碼嘗試刪除「正在被另一進程使用」的pdf文件時停止。代碼尋找這個異常,應該等待大約30秒,然後再次嘗試刪除。在本地,我通過測試Harness運行此服務,並循環直到文件可供刪除(平均需要大約5分鐘),但在服務器上,服務因應用程序事件日誌中發現的Unhandled IOException而停止。我不明白爲什麼它會繼續在本地處理,但不在服務器上。任何想法或其他信息將不勝感激。.Net運行時錯誤停止服務;未處理的IOException

以下是在事件日誌中的錯誤:

該過程由於未處理的異常終止。

異常信息信息:System.IO.IOException 堆棧: 在System.IO .__ Error.WinIOError(的Int32,System.String) 在System.Console.GetBufferInfo(布爾,布爾的ByRef) 在processorName。在System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext,System.Threading.ContextCallback,System.Object,Boolean)System.Threading.ThreadHelper.ThreadStart_Context(System.Object) 上FileProcessingThread.CleanUpDirectory(System.Object) at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext,System.Threading.ContextCallback,System.Object) at Sys tem.Threading.ThreadHelper.ThreadStart(System.Object的)

此外,在事件日誌中顯示該錯誤,以及:

的EventType 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。

這是應該處理異常,等待並重試刪除文件的代碼。

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; 
     } 
    } 
} 

回答

2

您試圖在服務中使用控制檯類,該服務沒有與之關聯的控制檯窗口。您應該使用一些不假定有控制檯窗口的備用記錄形式。作爲一個例子,log4net允許你配置多個「appender」,比如控制檯,文件和事件日誌appender,以便同時使用(如果它們不合適,它將被忽略)。

編輯澄清:

您可以手動創建一個控制檯窗口與AllocConsole P/Invoke調用如果你絕對需要。默認情況下,服務不會與您的桌面交互,因此創建控制檯窗口將是一個壞主意。爲此,您需要使用「允許服務與桌面交互」設置開啓來配置服務。這有安全隱患,特別是對於有多個用戶的機器,所以我會建議不要這樣做。

+0

這是否導致錯誤?我不明白爲什麼它是用控制檯寫的東西,我不認爲它是必要的,因爲一些日誌記錄服務已經寫入日誌文件。 – JennyCB 2011-05-05 18:22:11

+1

+1。請注意異常跟蹤:'在System.Console.GetBufferInfo(布爾值,布爾值ByRef)''這是使用控制檯導致問題,而不是與文件交互。我會刪除或改變調用到'Console.CursorLeft'和'Console.WriteLine' – CodingWithSpike 2011-05-05 18:35:48

+0

謝謝!我會嘗試。 – JennyCB 2011-05-05 18:57:50

0

它看起來像你的嘗試抓住之前發生錯誤。鑑於你應該看到你的日誌記錄輸出的特定消息(我認爲它會轉到事件日誌)。我沒有看到類似於日誌中的消息。您可能希望有一個應用程序域異常處理程序來捕獲任何異常並將其記錄下來。

+0

代碼中的日誌記錄是通過文件或控制檯完成的(當我通過線束進行本地測試時可以看到)。日誌和目錄內容指出,PDF文件正在被刪除,直到代碼達到一個仍在使用中(並且正在被什麼進程使用,我不知道),所以有文件從目錄和主文本中刪除文件仍然存在.InProgress擴展名,這意味着它永遠不會移動到已處理的目錄。在本地測試時,如果在我的嘗試接收之外,我是否應該得到異常? – JennyCB 2011-05-05 18:13:00

+0

不確定。如果目錄不存在於服務器上,則其他內容可能會失敗並拋出IOException。這就是爲什麼我認爲你看到你的代碼之外的東西。 – 2011-05-05 22:00:36

0

此外,你應該確保你的m_log例程有適當的錯誤處理,因爲這也可能是罪魁禍首。