2016-11-18 14 views
0

例外のパフォーマンスヒットについて論争のある意見があります。1000タスクをキャンセルするThrowIfCancellationRequested()の代わりに?

ただし、タスクをキャンセルするためにThrowIfCancellationRequestedを使用する標準的な方法と思われます。

ここで、一度に1000個のタスクをキャンセルしたい場合、ThrowIfCancellationRequestedはまだ適切な方法ですか?

**編集**

[OK]を、私はテストを実行し、ThrowIfCancellationRequestedを使用するには、パフォーマンスの問題です。 TaskSchedulerは賢いので、1000タスク自体は問題ではありません。

ThrowIfCancellationRequestedのパフォーマンス上の欠点を持たないが、例外(いくつかのコード階層レベルにもかかわらず、扱いやすい)の利点を持っている優れた代替品があるかどうかは疑問です。

+0

試しに試してみるとよいでしょう。 1000のタスクが大量であると、それだけでパフォーマンスの問題が発生する可能性があります。 – Sefe

+0

いいえ、私はテストを実行しました。それは 'ThrowIfCancellationRequested'を使うためのパフォーマンス上の問題です。 TaskSchedulerは賢いので、1000タスク自体は問題ではありません。 'ThrowIfCancellationRequested'のパフォーマンス上の欠点を持たないが、例外(いくつかのコード階層レベルにもかかわらず扱いやすい)の利点を持っている良い置換えがあるかどうかは疑問です。 – eikuh

答えて

0

私はスローが問題だとは思わないが、あなたの1000のタスク。スケジューラーは一度にすべてのタスクを実行することができないため、ほとんどのタスクをキューに入れなければなりません。それらがすべて1つを共有している場合、実行中のすべてのタスクはキャンセルされます。スケジューラは、すぐに取り消される待ち行列に入れられたタスクを実行します。スケジューラーがタスクをキャンセルするだけですべての作業を実行できるので、非効率です。

タスクを実行するときにCancellationTokenを渡しますか?それをやりたければ、スケジューラーは取り消しを知っているでしょう。私が推奨することは、すべてのタスクを一度にスケジュールすることではありません。チャンクに分割し、Task.ContinueWithを使用します。ここでタスクが完全に実行されないようにすることができます。

+0

いいえ、1000のタスクはそれほど大きな問題ではありません。 'if(IsCancellationRequested)return 'を使うと、各タスクに0.15ミリ秒(1000タスクで150ミリ秒)かかります。ただし、 'ThrowIfCancellationRequested'を使用すると、各タスクで11ミリ秒かかります(1000タスクでは11000ミリ秒= 11秒)。 – eikuh

+0

' ContinueWith'を使用すると、 'ThrowIfCancellationRequested 「はるかに少ない。 – Sefe

関連する問題