private object _lockObject = new object();
lock (_lockObject)
{
// critical section
using (token.Register(() => token.ThrowIfCancellationRequested())
{
// Do something that might need cancelling.
}
}
Cancel()
トークンを呼び出すと、それがコールバックに接続されているため、がThrowIfCancellationRequested()
呼び出されRegister
ます。ここには、任意のキャンセル ロジックを配置できます。呼び出しを完了する条件を強制することで、呼び出しのブロックをキャンセルできるため、このアプローチは優れています。
ThrowIfCancellationRequested は OperationCanceledException をスローします。呼び出し元のスレッドでこれを処理する必要があります。そうしないと、プロセス全体が停止する可能性があります。これを行う簡単な方法は、Task クラスを使用してタスクを開始することです。これにより、すべての例外が集約され、呼び出しスレッドで処理できるようになります。
try
{
var t = new Task(() => LongRunningMethod());
t.Start();
t.Wait();
}
catch (AggregateException ex)
{
ex.Handle(x => true); // this effectively swallows any exceptions
}
ここで協同組合のキャンセルをカバーするいくつかの良いもの