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
}
個人的には、最初の方法を好みます。なぜなら、4 つの余分な 1 行のメソッドを作成するのが好きではないからです。
ビューモデルは、コールバックする Dispatcher を知る必要があることに注意してください。これを行う最も簡単な方法は、上記で想定したように、DispatcherObject からビュー モデルを派生させることです。もう 1 つの方法は、ビュー モデルのコンストラクターまたは FileSystemWatcher イベントを登録するメソッドが Dispatcher.Current のコピーをローカル フィールドまたはローカル変数に格納し、それを .BeginInvoke 呼び出しに使用することです。
また、必要に応じて、ビュー モデルではなくビュー コード ビハインドでまったく同じコードを使用できることにも注意してください。