【问题标题】:Preventing FileSystemWatcher throwing TaskCanceledException when calling Shutdown()调用 Shutdown() 时防止 FileSystemWatcher 抛出 TaskCanceledException
【发布时间】:2017-09-26 14:33:35
【问题描述】:

我正在构建一个 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)
{

}

但这似乎是一个 hack,并没有解决根本问题。

在我看来,C# 试图告诉我我正在以错误的方式解决这个问题。有没有更好的办法?

【问题讨论】:

  • 有趣 - 我在 Win 10 上使用 VS2015 并针对 .NET Framework 4.5.2

标签: c# wpf


【解决方案1】:

调度程序中有一个特殊的方法来调用关闭:InvokeShutdown

Changed 事件处理程序调用Application.Current.Dispatcher.InvokeShutdown(); 可避免异常。

这会关闭调度程序,进而导致应用程序关闭。关于这个和Application.Shutdownhere的区别有一些讨论。

【讨论】:

  • 这行得通,谢谢。等一下看有没有其他意见再采纳。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多