2017-09-26 18 views
2

ファイルが一定期間内に変更されたかどうかを確認する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#が私に間違ったやり方をしようとしているようです。より良い方法がありますか?

+0

興味深い - 私はWin 10でVS2015を使用しており、.NET Framework 4.5.2をターゲットにしています –

答えて

1

シャットダウンを起動するためのディスパッチャに特別な方法があります:ChangedイベントハンドラからApplication.Current.Dispatcher.InvokeShutdown();を呼び出すInvokeShutdown

は例外を回避できます。

これにより、ディスパッチャがシャットダウンし、アプリケーションがシャットダウンします。これとApplication.Shutdownhereの違いについていくつかの議論があります。

+0

これは、ありがとうございます。私は受け入れる前に他に意見があるかどうか少し調べるつもりです。 –

関連する問題