2010-02-02 52 views
1

通過做一些谷歌,我開始知道'它用來跟蹤文件系統操作'。但我不明白它的實用性,觀察者可以直接觸發事件而不將其存儲在某個中間緩衝區中!InternalBuffer在.net中扮演什麼角色FileWatcher

是否將異步事件流(複製/修改文件)轉換爲同步事件調用?另外,我不確定FileWatcher是否異步觸發事件。

有人可以對此有所瞭解嗎?

回答

1

使FileSystemWatcher工作的底層Windows API是ReadDirectoryChangesW()。請注意第二個參數lpBuffer。這是與內部緩衝區的一對一匹配,您可以使用InternalBufferSize屬性設置其大小。

緩衝區是必需的,因爲Windows無法輕鬆運行用戶代碼來響應目錄更改。這些更改由相應的文件系統驅動程序檢測到,它們以內核模式運行。運行用戶模式代碼需要昂貴的模式切換和線程上下文切換,對於每個檢測到的更改都要花費太多的代價。緩衝區用於收集更改,等待用戶模式代碼開始運行並清空緩衝區。

FSW有一個很好的文檔失敗模式,可能會有太多的變化跟上。您會在託管代碼中看到錯誤事件。增加緩衝區大小可以提供很大幫助,默認緩衝區在4096字節處非常小。然而,將它設置爲任意大並不是一個好主意,內核中也需要緩衝區空間,這是從內核內存池獲取的。這是一個有限的資源,從池中吞噬大量影響機器上運行的所有程序。

1

當它不能一次處理它們時,filewatcher將不得不緩衝請求,這主要是由您編寫的用於響應FileSystemwatcher引發的事件的代碼造成的。據我所知,FileSystemWatcher事件不是異步的,但你可以在事件中產生線程,以使得你的代碼的處理是異步的。當然,文件系統可以一次更改多個文件,例如刪除所有文件或考慮複製粘貼。

我希望這很清楚。

2

我想你錯過了緩衝區的問題。

MSDN, FileSystemWatcher(重點煤礦):

The Windows operating system notifies your component of file changes in a buffer created by the FileSystemWatcher. If there are many changes in a short time, the buffer can overflow. This causes the component to lose track of changes in the directory, and it will only provide blanket notification.

因此,它不是,它沒有告訴你還沒有事件的緩衝,這是它提供了對Windows支持擺在首位的通知緩衝區,而不必輪詢。如果Windows在此實例中引發大量操作,則此緩衝區將溢出,並且您,FileSystemWatcher的使用者/用戶將會丟失一些通知。

+0

+1,比我的答案更好=) – 2010-02-02 09:23:04

0

是的,FileSystemWatcher用於跟蹤文件系統中的更改。這手錶目錄,並報告該目錄下更改任何文件:

  • OnCreated:創建一個文件或目錄時調用
  • 調用onChanged:當一個文件或目錄被更改時調用
  • OnRenamed:當一個文件或目錄被重命名叫
  • OnDeleted:當文件或目錄被刪除叫

「內部緩衝區」是操作系統如何將信息發送到FileSyst emWatcher。其大小由「InternalBufferSize」屬性控制。

如果一次發生太多變化,內部緩衝區可能會填滿。然後,而不是讓所有的個人改變,你得到一個單一的變更通知:

  • 的OnError:當個別變化,因爲緩衝區溢出而丟失叫

FileSystemWatcher的不觸發事件是異步的。具體而言,只要文件發生更改就會觸發該事件。

相關問題