キャンセルしたいタスクがあります。
これを行う通常の方法は、 を使用することCancellationToken
です。
this.task = new SpecialTask(() =>
{
for (int i = 0; i < ushort.MaxValue; i++)
{
CancelToken.ThrowIfCancellationRequested();
Console.WriteLine(i);
}
}, this.CancelToken);
しかし、現実の世界では、物事はそれほど単純ではありません。非同期コードはループできず、次のようになります。
this.task = new SpecialTask(() =>
{
CancelToken.ThrowIfCancellationRequested();
Operation1();
CancelToken.ThrowIfCancellationRequested();
Operation267(CancelToken);
CancelToken.ThrowIfCancellationRequested();
object232.Operation345();
CancelToken.ThrowIfCancellationRequested();
object99.Operation44(CancelToken);
CancelToken.ThrowIfCancellationRequested();
Operation5(CancelToken);
...
CancelToken.ThrowIfCancellationRequested();
Operation...n(CancelToken);
}, this.CancelToken);
オブジェクトとメソッド名に乱数を使用して、ループがまったく作成できないことを示しました。
最も厄介なのは、同じことを何度も書き続けなければならないことCancelToken.ThrowIfCancellationRequested()
です。
そして、それだけでは不十分であるかのCancellationToken
ように、Microsoft によると、適切なタイミングで実行時間の長い操作を停止できるようにするためだけに、コード全体をドラッグする必要があります。
そうは言っても、コードを汚染するこれらの繰り返しの呼び出しをなくす方法はありますか?
また、
try
{
task.Wait(cancelToken);
}
catch(OperationCancelledException)
{
}
メソッドに対してanOperationCancelledException
がスローされ、キャッチされWait
ます。CancelToken.ThrowIfCancellationRequested()
ただし、タスクによって実行される長い操作は、時々チェックがなければ停止しません。
待機のために例外がキャッチされたときに内部操作を停止させる方法はありますか?