我认为主要的视图模型是正确的位置来定义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