【发布时间】: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