Когда я отменяю свой асинхронный метод со следующим контентом, вызывая метод Cancel()
моего CancellationTokenSource
, он в конечном итоге остановится. Однако, так как строка Console.WriteLine(await reader.ReadLineAsync());
занимает совсем немного времени, я попытался передать свой CancellationToken на ReadLineAsync()
(ожидая, что он вернет пустую строку), чтобы сделать метод более восприимчивым к моему вызову Cancel()
. Однако я не мог передать CancellationToken
в ReadLineAsync()
.
Можно ли отменить вызов Console.WriteLine()
или Streamreader.ReadLineAsync()
, и если да, как это сделать?
Почему ReadLineAsync()
не принимает CancellationToken
? Я подумал, что хорошей практикой является предоставление Async-методам необязательного параметра CancellationToken
, даже если метод по-прежнему завершается после отмены.
StreamReader reader = new StreamReader(dataStream);
while (!reader.EndOfStream)
{
if (ct.IsCancellationRequested){
ct.ThrowIfCancellationRequested();
break;
}
else
{
Console.WriteLine(await reader.ReadLineAsync());
}
}
Обновление
Как указано в комментариях ниже, только вызов Console.WriteLine()
уже занимал несколько секунд из-за плохо сформированной входной строки из 40 000 символов в строке. Нарушение этого решения решает мои проблемы с ответом, но меня все еще интересуют любые предложения или обходные пути о том, как отменить этот долговременный оператор, если по какой-то причине было записано 40 000 символов в одну строку (например, при сбрасывании всей строки в файл).