c# - 防止 FileSystemWatcher 在调用 Shutdown() 时抛出 TaskCanceledException

标签 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 block 包围关闭调用

try
{
    Application.Current.Dispatcher.Invoke(() => Shutdown())
}
catch(TaskCanceledException)
{

}

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

在我看来,C# 试图告诉我我正在以错误的方式进行处理。有没有更好的办法?

最佳答案

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

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

这将关闭调度程序,进而导致应用程序关闭。关于这和 Application.Shutdown 之间的区别有一些讨论 here .

关于c# - 防止 FileSystemWatcher 在调用 Shutdown() 时抛出 TaskCanceledException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46429311/

相关文章:

c# - 在 C# Windows 窗体应用程序中获取当前页面的 Html 源

c# - 使 Gridview 的一个字段成为选择链接?

c# - 允许文本框仅支持数字和 OemMinus?

c# - 如何将报表查看器语言设置为与 CultureInfo.CurrentUICulture 相同?

c# - 多个数据模板和 Grid.IsSharedSizeScope - 未与内容宽度对齐

c# - 将 SharePoint 文件夹和内容移动到同一文档库中的不同位置

c# - 循环中的 Process.Start(url) 不会启动每个实例

wpf - 如何更改 Combobox WPF 的 CornerRadius

c# - C#使用异步方法进行模型

c# - 单击图像的一部分