Я думаю, что модель основного вида - это то место, где нужно определить 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;
Каждый из «Код для обработки» будет выполняться в потоке пользовательского интерфейса, чтобы он мог обновить 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
}
Лично я предпочитаю первый способ сделать это, потому что мне не нравится создавать четыре дополнительных однострочных метода.
Обратите внимание, что вашей модели представления нужно будет знать, какой Dispatcher необходимо перезвонить. Самый простой способ сделать это - извлечь модель представления из DispatcherObject, как предполагалось выше. Другой способ - конструктор модели представления или метод, который регистрирует события FileSystemWatcher, для сохранения копии Dispatcher.Current в локальном поле или локальной переменной, а затем использовать ее для вызовов .BeginInvoke.
Также обратите внимание, что вы можете использовать точно такой же код в коде представления, а не в модели представления, если хотите.