常にブロックされるタスクがあり、タスクをキャンセルするために使用される CancellationToken が渡されます。ただし、タスクのキャンセル時に実行するように設定されている継続タスクは実行されません。コードは次のとおりです。
_tokenSrc = new CancellationTokenSource();
var cnlToken = _tokenSrc.Token;
Task.Run(() =>
// _stream.StartStream() blocks forever
_stream.StartStream(), cnlToken)
.ContinueWith(ant =>
{
_logger.Warn("Stream task cancellation requested, stopping the stream");
_stream.StopStream();
_stream = null;
_logger.Warn("Stream stopped and task cancelled");
}, TaskContinuationOptions.OnlyOnCanceled);
後でコードのどこかで...
_tokenSrc.Cancel();
_stream.StartStream() に Task を使用しなければならなかった理由は、この呼び出しが永久にブロックされるためです (私が制御できない API、_stream は Web サービスからデータをストリーミングするサードパーティの Api を参照することに注意してください)。それは別のスレッドで。
タスクをキャンセルする最良の方法は何ですか?