ファイルが一定期間内に変更されたかどうかを確認するWPFアプリケーションを構築しています。Shutdown()を呼び出すときにFileSystemWatcherがTaskCanceledExceptionをスローするのを防ぐ
最終的にApp.Current.Shutdown()
の呼び出しをトリガーするメソッドが、FileSystemWatcher
イベントにアタッチされたイベントハンドラーであり、TaskCanceledException
がスローされるという問題が発生しています。次のように
最小限の作業例は次のとおりです。
は新しいWPFアプリケーションを作成します。 In App.xaml.cs
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
FileSystemWatcher w = new FileSystemWatcher();
w.Path = /*path to suitable test folder*/
w.Filter = "Test.txt";
w.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite;
w.Changed += (s, a) =>
{
//Shutdown(); --Throws InvalidOperationException (Calling thread cannot access this object)
Application.Current.Dispatcher.Invoke(() => Shutdown());
};
w.EnableRaisingEvents = true;
}
}
ファイルTest.txtを編集すると、アプリケーションが終了するはずです。
例外上映を防ぐために、私は空のtry-catchブロック
try
{
Application.Current.Dispatcher.Invoke(() => Shutdown())
}
catch(TaskCanceledException)
{
}
とシャットダウンの呼び出しを囲むことができますが、これはハックのようですし、根本的な問題を解決していません。
C#が私に間違ったやり方をしようとしているようです。より良い方法がありますか?
興味深い - 私はWin 10でVS2015を使用しており、.NET Framework 4.5.2をターゲットにしています –