我認爲主要的視圖模型是正確的位置來定義FileSystemWatcher。而對於線程問題,這是最簡單的方法:
_watcher = new FileSystemWatcher(path);
_watcher.Created += (obj, e) =>
Dispatcher.BeginInvoke(DispatcherPriority.Send, new Action(() =>
{
// Code to handle Created event
};
_watcher.Changed += (obj, e) =>
Dispatcher.BeginInvoke(DispatcherPriority.Send, new Action(() =>
{
// Code to handle Changed event
};
_watcher.Renamed += (obj, e) =>
Dispatcher.BeginInvoke(DispatcherPriority.Send, new Action(() =>
{
// Code to handle Renamed event
};
_watcher.Deleted += (obj, e) =>
Dispatcher.BeginInvoke(DispatcherPriority.Send, new Action(() =>
{
// Code to handle Deleted event
};
// ...
_watcher.EnableRaisingEvents = true;
各的「代碼來處理」,將在UI線程中執行,因此它可以更新ObservableCollection
。請注意,此代碼中提供了FileSystemEventArgs「e」。
如果你喜歡使用單獨的事件處理方法,你可以從上面的代碼中調用它們或用這個方便的快捷鍵:
var switchThread =
(FileSystemEventHandler handler) =>
(object obj, FileSystemEventArgs e) =>
Dispatcher.BeginInvoke(DispatcherPriority.Send, new Action(() =>
handler(obj, e))
_watcher = new FileSystemWatcher(path);
_watcher.Created += switchThread(OnCreated);
_watcher.Changed += switchThread(OnChanged);
_watcher.Deleted += switchThread(OnDeleted);
_watcher.Renamed += switchThread(OnRenamed);
_watcher.EnableRaisingEvents = true;
其中OnCreated
,OnChanged
,OnDeleted
和OnRenamed
是正常的事件處理方法與正常的簽名,例如:
void OnChanged(object sender, FileSystemEventArgs e)
{
// Code to handle Changed event
}
個人而言,我更喜歡做它的第一種方式,因爲我不喜歡創建四個額外的1線的方法。
請注意,您的視圖模型將需要知道回撥哪個Dispatcher。如上所述,最簡單的方法是從DispatcherObject派生視圖模型。另一種方式是視圖模型的構造函數或註冊FileSystemWatcher事件的方法在本地字段或局部變量中存儲Dispatcher.Current的副本,然後將其用於.BeginInvoke調用。
另請注意,如果您願意,您可以在視圖代碼隱藏中使用完全相同的代碼,而不是視圖模型中的代碼。
很酷。 我想監視我的整個計算機,併爲每個驅動器創建單獨的FileSystemWatcher對象。這可以嗎?或者有沒有辦法用一個監視器對象來監視所有的驅動器? – Amsakanna 2010-03-04 05:36:13
我不認爲有任何方法可以用一個'FileSystemWatcher'來監視所有的驅動器,但是可以爲每個驅動器創建一個'FileSystemWatcher'。您可以使用FileSystemWatcher.IncludeSubdirectories屬性來監視整個驅動器。我沒有測試過這個表現。另請注意,如果FileSystemWatcher的內部緩衝區溢出,您將收到一個重置事件,此時您必須重新掃描該樹以查找更改的內容。 – 2010-03-04 06:12:11
目前我已經爲每個驅動器創建了一個觀察器。但正如你所說,已經檢查了緩衝區溢出...... – Amsakanna 2010-03-04 09:24:22