スレッドは割り込みをサポートしています。なぜタスクはありませんか?C#タスクが中断されているのはなぜですか?
私の(無知)の観点から、タスクが中断をサポートすることを可能にするのが妥当と思われる。)タスクが現在task.Interruptを(呼び出して、スレッド上で実行されていない場合は
- をTaskInterruptExceptionを設定しますタスクがスケジュールされたときにスローされます。
- それ以外の場合、タスクを実行しているスレッドでTaskInterrupExceptionがスローされます。この例外は、タスク内で捕捉されるか、または上部のAggregateExceptionに追加されます。この機能には、実行中のスレッドを知るタスクが必要になると思います(これは不合理ですか?)
この機能を実装するのに必要な部分は既に存在するのですか、それとも言語実装を変更する必要がありますか?
追加: 私はそれに関連する答えがCancellationToken
と(落胆)Thread.Abort
アプローチを議論して、タスクを中止/殺害について議論SO上の数多くの質問を読みました。
私自身が手を出すと、CancellationToken.RegisterでThread.Interruptを登録しても、タスクで実行中のスレッドが中断されるのではなく、代わりにトークンのキャンセルを呼び出すスレッドが中断されることがわかりました。
私が見ているように、開発者がタスクを(静かに)終了できるようにするための認可された機能が必要です。
また、この機能は、開発者がではなく、がタスクで実行されているコードを所有している状況で特に有用であることを追加します(CancellationTokensを取るためにタスクを書き直さないようにする)。
そして、原則として、タスクの実行者が、タスクの実装者に応じて正しくキャンセルすることなく、キャンセルの保証を提供できる方法があるようです。キャンセルトークン。
別加え: かかわらず、リスクの、C#のAPIはThread.Abort
とThread.Interrupt
をサポートしています。だから、私の質問は、本質的には、同じAPI(同じ固有のリスクを持つ)をTask
がサポートしないのはなぜですか?
更新
この投稿はthis questionの重複としてマークされています。しかし、私は既にこの質問(とすべての回答)を投稿する前に、参照された質問を読んでいました。この質問は重複ではなく、追加の情報を求めている関連する質問です。その質問は「中止できますか?」と答え、本質的に「あなたは中止してはいけません」と質問します。「私の質問は、割り込みが中止よりも優れているから、なぜサポートされている機能を中断しないのですか? this questionによれば、を中断する重要な違いがあり、とが中断してスレッドを中断し、その中断がより好ましい。
http://stackoverflow.com/a/14831590/17034 –
リンクありがとう、Hans。あなたはThread.Abortについて議論します。 Thread.Interruptについても同じですか?私は、Thread.Interruptが厄介な場所に例外を投げるのを避けることになっていたことを理解しました。 –
また、リスクに関係なく、APIは引き続きThread.AbortとThread.Interruptをサポートしています。私の質問はなぜタスクは同じをサポートしていないのですか? –