0

私は最近、非常に速く、私の文脈でCancellationトークンはすべて、タスクがスケジュールされないようにすることが価値であることを学びました。私は待っているタスクで中止する必要がある、長時間実行している単一メソッドのタスクを持っています。どうすればこれを達成できますか?待っている仕事をどうやって中止できますか?

長時間実行しているメソッドに対して別のスレッドをリッピングするのが最初のアイデアですが、それ以上の場合はチェックを続けるループがあり、trueの場合は長時間実行するメソッドをホストするスレッドを中止します。

これは悪いですか?別の方法がありますか?

私は長時間実行しているタスクが1つの方法であるため、実行前にキャンセルトークンを確認するか、実行後に終了する前に長期実行方法を停止する機会はありません。すべてFileInfoドライブC :!のすべてのファイルのオブジェクトこれは、実行時間の長いコードです:

FileInfos = Mapper.Map<ObservableCollection<FileInfoViewModel>>(dirInfo.GetFiles($"*.{ext.TrimStart('.')}", SearchOption.AllDirectories)); 
私は2つの呼び出しにそれを分割し、それらの間でトークンをチェックし、それはあまり効果がありませんか、私は自分の中にCLRコードを書き換えて、手動でできる可能性があり

トークンをチェックするループを使用します。それはうまくいくが、それは非常に悪い匂いがする。

+5

[はい、それは悪いです](http://stackoverflow.com/questions/1559255/whats-wrong-with-using-thread-abort) 'Thread.Abort()'を呼び出すことはバグとして扱うべきです。協調キャンセルを行う必要があります。取り消されるスレッドは、キャンセルされたかどうか定期的に確認し、それに応じて対応する必要があります。それができない場合は、それを放棄するほうが安全でしょう。 –

+3

あなたの仕事が何をしているのか、キャンセルトークンが使えない理由を説明する必要があります。 –

+0

@SamKuhmonen私の編集をご覧ください。 – ProfK

答えて

1

ファイルシステムエンティティの列挙に使用される基本システムAPIは、すでにキャンセルをサポートしています。正しい管理対象APIを使用してください。

DirectoryInfo.GetFilesは、列挙型を配列に変換します。つまり、すべてのデータが収集されたときにのみ返されます。一方、DirectoryInfo.EnumerateFilesは列挙型を直接公開するため、いつでも評価を停止することができます。 Thread.Abortは、管理対象コードのときにスレッドを強制終了します。実際に時間がかかるものはすべてネイティブです。 FindFirstFile/FindNextFile API。

関連する問題