我正在構建一個WPF應用程序,用於檢查文件是否在特定時間段內被修改,如果是,應用程序將退出。防止FileSystemWatcher在調用Shutdown時拋出TaskCanceledException()
我遇到了一個問題,即最終觸發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#試圖告訴我,我正在以這種錯誤的方式去做。有沒有更好的辦法?
有趣 - 我在Win 10上使用VS2015,並將.NET Framework 4.5.2作爲目標。 –