2017-09-26 49 views
2

我正在構建一個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#試圖告訴我,我正在以這種錯誤的方式去做。有沒有更好的辦法?

+0

有趣 - 我在Win 10上使用VS2015,並將.NET Framework 4.5.2作爲目標。 –

回答

1

有一個在調度員的特殊方法來調用關機:InvokeShutdown

調用從Changed事件處理Application.Current.Dispatcher.InvokeShutdown();避免例外。

這會關閉調度程序,從而導致應用程序關閉。有一些關於這和Application.Shutdownhere之間的區別的討論。

+0

This works,thanks。謝謝。我會等一會兒,看看在接受之前是否有其他意見。 –

相關問題