调用Shutdown()时防止FileSystemWatcher抛出TaskCanceledException

时间:2017-09-26 14:33:35

标签: c# wpf

我正在构建一个WPF应用程序,用于检查文件是否在特定时间段内被修改,如果是,则退出应用程序。

我遇到的问题是,最终触发App.Current.Shutdown()调用的方法是附加到FileSystemWatcher事件的事件处理程序,并导致TaskCanceledException被抛出。

最小的工作示例如下:

创建一个新的WPF应用程序。在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#试图告诉我,我的方式是错误的。还有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

调度程序中有一种特殊方法可以调用关闭:InvokeShutdown

Application.Current.Dispatcher.InvokeShutdown();事件处理程序调用{​​{1}}可以避免异常。

这会关闭调度程序,从而导致应用程序关闭。关于这与Changed here之间的区别进行了一些讨论。