[英].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.