我有一个任务一直被阻塞,我传递了一个 CancellationToken 用于取消该任务。但是当任务被取消时,设置为在任务取消时执行的 Continuation 任务从未被执行。以下是代码:
_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() 的原因是这个方法会永远阻塞(这是我无法控制的第三方API,_stream指向一个从webservice中流式传输数据的第三方API),因此我必须在另一个线程上调用它。
最好的取消任务的方法是什么?
_tokenSrc.Cancel();
是取消任务的正确方式。但是,你还应该在任务内部监视此标记以进行取消操作。它不会自动发生。你正在使用全局范围的流执行可怕的操作。没有必要这样做,因为你的继续任务可以在主任务中发生。归根结底,你想做什么?为什么需要任务?请通过编辑上面的问题回答这两个问题。 - Victor Zakharov