2012-01-30 33 views
0

我有一個服務可以打開多個觀察者來觀察多個文件夾。在觀看文件夾一段時間後,我收到「網絡BIOS命令限制已達到」。c#服務「netwerk bios命令限制已達到」錯誤原因和最佳解決方案是什麼?

當我在here上閱讀時,這是由於長時間的請求超出允許範圍而造成的。

我相信這是由於下面的錯誤處理代碼我有,這是由觀察者錯誤事件觸發的。這通過再次調用WatchFile方法來啓動觀察器的新實例。我相信這會讓現在不存在的老觀察者繼續運行,並啓動一個新的觀察者,但是我恐怕停止觀察者可能會阻止它再次啓動它,或者將停止基於觀察者的所有實例。

或者我錯了,是錯誤依賴於更改的數量?這會導致100個文件同時進入以導致此錯誤。

我想停止並開始服務,每當我在這個錯誤運行,但這不會解決問題本身,但只是隱藏它。有更好的解決方案嗎?

private static void watcherError(String directory, Boolean intray, ErrorEventArgs e, FileSystemWatcher watcher) 
{ 
    Exception watchException = e.GetException(); 
    EventLog.WriteEntry("WhiteFileMover", String.Concat("error gedetecteerd, watcher werd herstart - ", watchException.Message), EventLogEntryType.Information); 
    watcher = new FileSystemWatcher(); 
    while (!watcher.EnableRaisingEvents) 
    { 
     try 
     { 
      // This will throw an error at the 
      // watcher.NotifyFilter line if it can't get the path. 
      WatchFile(directory, intray); 
     } 
     catch(Exception exp) 
     { 
      // Sleep for a bit; otherwise, it takes a bit of 
      // processor time 
      EventLog.WriteEntry("WhiteFileMover", String.Concat("Failed to restart watcher, retrying in 5 seconds - ", exp.Message), EventLogEntryType.Warning); 
      System.Threading.Thread.Sleep(5000); 
     } 
    } 
} 
+2

如何處置遇到錯誤的舊觀察者? – Kolja 2012-01-30 14:13:53

+0

@Kolja如果我做watcher.dispose,那隻能處理那個實例或基於觀察者的所有實例嗎?因爲我已經創建了3個觀察者實例,但只想處理其中的一個。 – Andy 2012-01-30 14:25:46

+0

它會處理變量指向的當前實例,這是失敗的實例。之後,您可以創建一個新的實例。但是你不會去處理它,只是創建一個新的,最終可能會有一堆浪費的觀察者實例。 – Kolja 2012-01-31 10:13:02

回答

2

看這句話:

watcher = new FileSystemWatcher(); 

您在FileSystemWatcher的變量傳遞,但完全忽略了傳遞的值。相反,您創建了一個新實例。不僅如此,但你沒有正確地處置實例。我的猜測是,你有一堆舊的FileSystemWatcher對象掛在等待收集。其中每一個都會保留來自操作系統的一些真實的文件系統資源。隨着時間的推移,你用完了可用的文件句柄。

+0

我在創建新觀察者之前添加了watcher.dispose,但錯誤保持不變。在舊觀察者從內存中移除之前,我還需要做些什麼? – Andy 2012-01-31 12:29:08

+0

@Andy Dispose()有**沒有**與內存。謝天謝地,內存不是你的問題(文件句柄)。但真正的問題是,你不應該一直創造一個新的觀察者。你想爲你的應用使用**正好一個**觀察者,並傳遞給那個實例的引用。 – 2012-01-31 16:27:58

相關問題