バックグラウンド タスクとして実行される「インデックス サービス」を持つ WPF アプリケーションを開発しています。インデックス サービスは、フォルダーを監視する FileSystemWatcher を利用します。ファイルが変更されると、インデックス サービスはファイルの内容を読み取り、インデックスを更新します (私は Lucene.Net を使用しています)。私のインデックス サービスはシングルトンで、アプリケーションの起動時に次のように開始されます。
new TaskFactory().StartNew(_indexingService.StartService);
メソッドは次のStartService()
ようになります。
private readonly ManualResetEvent _resetEvent = new ManualResetEvent(false);
public void StartService()
{
var watcher = new FileSystemWatcher
{
// Set the properties
};
watcher.Changed += UpdateIndexes();
_resetEvent.WaitOne();
}
アプリケーションが閉じているときに、このメソッドを呼び出すつもりです。これにより、インデックス サービスのバックグラウンド タスクが終了することがわかります。
public void StopService()
{
_resetEvent.Set();
}
まず第一に、これはアプリケーションの存続期間中に実行する必要があるバックグラウンド タスクを開始および停止するための正しい "パターン" ですか?
第二に、このシャットダウンはどれほど「優雅」でしょうか? ウォッチャーChanged
イベント ハンドラーが起動し、ファイルを反復処理して、ファイルを読み取り、インデックスを更新しているとします。タスクが停止した場合、この処理はフローの途中で中止されますか、それともイベント ハンドラー メソッドが最初に完了まで実行されますか?