2013-02-12 65 views
1

我在Windows服務中有一個FileSystemWatcher對象。我在使用該應用程序的控制檯應用程序中將它編寫爲我的組件的存根。FileSystemWatcher OnError不適用於Windows服務

我的組件實例化FileSystemWatcher並設置爲觀察映射的驅動器。這對測試存根控制檯應用程序和可部署Windows服務都非常適用。

我也onerror事件迷上了log4net的日誌記錄一個FATAL級別的錯誤:

public FileSystemWatcher CreateFileWatcher() 
    { 
     FileSystemWatcher watcher = new FileSystemWatcher(); 

     try 
     { 
      log.Info("Configuring DPIFileWatcher"); 
      watcher.Filter = "*.xml"; 
      log.Info("DPIFileWatcher Filter set to: *.xml"); 
      string watcherPath = ConfigurationManager.AppSettings["InoundPath"].ToString(); 
      watcher.Path = watcherPath; 
      log.Info(String.Format("DPIFileWatcher Path set to: {0}", watcherPath)); 

      watcher.Created += new FileSystemEventHandler(DPIWatcher_FileCreated); 
      watcher.Changed += new FileSystemEventHandler(DPIWatcher_FileChanged); 
      watcher.Error += new ErrorEventHandler(DPIWatcher_Error); 
      watcher.EnableRaisingEvents = true; 

      log.Info("DPIFileWatcher Configuration Successful."); 
     } 
     catch(Exception e) 
     { 
      log.Fatal(String.Format("Failed to configure DPIFileWatcher: {0}", e.Message)); 
     } 

     return watcher; 
    } 

這是我的錯誤事件:

private void DPIWatcher_Error(object source, ErrorEventArgs e) 
    { 
     log.Fatal(String.Format("FileWatacher error: {0}", e.GetException().Message)); 
    } 

如果我拔掉測試網絡誤差損失網卡,我從我的控制檯應用程序得到以下日誌錯誤:

FATAL [ 12] 2013-02-12 12:14:02,142 SMILLER-E6430 METHOD: DPIWatcher_Error  GenFileWatch.DPIFileWatcher- FileWatacher error: The specified network name is no longer available (C:\Development\GenFileWatch\GenFileWatch\DPIFileWatcher.cs: 447) 

但硫從Windows服務中運行時,s日誌錯誤將不起作用。

有沒有人有任何想法爲什麼或如何解決?

+0

它記錄什麼? – BNL 2013-02-12 18:07:59

+0

您是否從'OnStart'創建FileSystemWatcher實例?在創建它之後你對這個參考做了什麼?它可能會過早收集,因此事件永遠不會發生。只是一個猜測。 – 2013-02-12 18:57:54

回答

0

首先,您的服務是否可以通過可訪問您要監控的目錄的帳戶運行。 99%的時間,運行「控制檯」應用程序和運行「服務」在兩個不同的用戶環境下運行。如果該用戶上下文無法訪問該目錄(或者URL只意味着另一個用戶上下文中的某些內容),我不認爲會調用OnError。

其次,FileSystemWatcher是相當不可靠的。它在大多數情況下都有效,但有時不會。它使用基本的原生函數``,這是記錄與

When you first call ReadDirectoryChangesW, the system allocates a buffer to store change information. This buffer is associated with the directory handle until it is closed and its size does not change during its lifetime. Directory changes that occur between calls to this function are added to the buffer and then returned with the next call. If the buffer overflows, the entire contents of the buffer are discarded, the lpBytesReturned parameter contains zero, and the ReadDirectoryChangesW function fails with the error code ERROR_NOTIFY_ENUM_DIR

+0

感謝您的反饋。 儘管您的第一條評論,我們顯然有權通過Windows服務訪問文件共享,因爲主要功能在服務中正常工作。文件服務器偵聽映射驅動器上的文件夾中的新文件,並且創建的事件被觸發,我們在那裏做我們想做的事情。所以Win服務可以訪問該驅動器。因此,我們無法弄清楚爲什麼onerror不會告訴我們「win服務中指定的網絡名稱不再可用」,就像它從控制檯應用程序所做的那樣。 – Sam 2013-02-13 13:43:30

+0

另外,在你的第二條評論中,我們剛開始測試這個,但是我讀過你可以增加緩衝區大小來糾正這個問題。儘管對性能不利。所以試驗和錯誤讓它恰到好處。 – Sam 2013-02-13 13:45:26

相關問題