У меня есть задача, которая всегда заблокирована, и в нее передан 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(), заключается в том, что этот вызов блокируется навсегда (API, над которым я не контролирую, обратите внимание, что _stream относится к стороннему API, который передает данные из веб-службы), поэтому мне пришлось вызвать это в другой ветке.
Как лучше всего отменить задание?
_tokenSrc.Cancel();
- правильный способ отменить задачу. Однако вы также должны отслеживать этот токен на предмет отмены внутри своей задачи. Это не произойдет само собой. Вы делаете страшные вещи здесь, используя глобальные потоки. В этом нет смысла, потому что ваша задача-продолжение может происходить внутри основной задачи. Суть в том, что вы пытаетесь сделать? Зачем вам задачи для этого? Пожалуйста, ответьте на эти два вопроса, отредактировав свой вопрос выше. - person Neolisk   schedule 29.03.2014