簡體   English   中英

當引發異常時,.NET的FileSystemWatcher崩潰,throws文件正在用於將來的文件

[英].NET's FileSystemWatcher crashes when an exception is raised, throws file is in use for future files

我在使用filesystemwatcher時遇到了問題,這讓我發瘋了。

事實證明我正在觀察文件夾中的新文本文件,當Created Event被引發時,我基本上使用以下代碼閱讀它:

string txtTemp = File.ReadAllText(MyFilePath);

之后,我處理txtTemp字符串中的數據,基本上我讀了它的行並將數據存儲在DB上,不是很簡單嗎?

問題是當在這個過程中引發異常時(假設db連接失敗),如果我抓住它並不重要,因為對於下一個即將到來的文件,應用程序將拋出異​​常說

“該進程無法訪問文件'theNewComingFile.txt',因為它正由另一個進程使用。”

如果新創建的文件甚至沒有被打開或讀取,它們怎么可能正在使用? 並且應用程序不斷拋出所有新文件的“進程無法訪問文件”異常。

我們唯一能做的就是關閉並重新打開應用程序,這會重置應用程序,一切正常,直到再次引發任何類型的異常>(天啊!)

有任何想法嗎? 任何解決方法? 有什么想法嗎? 任何建議......任何事情? 呵呵呵呵=)

謝謝老兄!

您可以使用Sysinternals Process Explorer開始調查。 它將為您提供更多詳細信息,尤其是關於哪個進程保存文件。

在完成文件完成之前,將觸發Created事件。

來自MSDN

創建文件后立即引發OnCreated事件。 如果正在將文件復制或傳輸到監視目錄中,則會立即引發OnCreated事件,然后是一個或多個OnChanged事件。

因此,獲得您描述的異常將是相當正常的。 當我遇到這種情況時,我基本上首先測試文件,看看我是否可以訪問它。 這是我使用的功能:

  private static bool GetExclusiveAccess(string filePath)
  {
     try
     {
        using (FileStream file = new FileStream(filePath, FileMode.Append, FileAccess.Write))
        {
           file.Close();
           return true;
        }
     }
     catch (IOException)
     {
        return false;
     }
  }

如果您沒有訪問權限,則需要等待並再次檢查。

它可能是打開文件的行為更改最后讀取的時間戳:這可能會導致循環。

您可能希望嘗試更改設計,以便在(並且僅當)文件尚未排隊等待處理時將事件放置到隊列中。 然后,您可以在另一個線程的適當控制下捕獲異常等,而不會妨礙觀察程序。

[我在過去看過FileSystemWatcher一些非常有趣的角落案例 - 當它走投無路時它可能是一個野獸。 當內部緩沖區溢出因為它被事件淹沒時,一個(一段時間后)在Windows Server 2003中導致了一個不太可重現的藍屏掛起。 最好小心。]

解決方法很簡單 - 將您的觀察者放在自己的AppDomain中,拆除AppDomain並在處理異常時重新啟動。 這很可能會解決您的問題。 但為什么會這樣呢? 我將不得不考慮一下,也許找到一些東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM