Согласно MSDN: Отмена в управляемых потоках
Отмена является кооперативной и не навязывается слушателю.
слушатель определяет, как изящно завершить в ответ на
запрос на отмену.
Вам нужно будет создать перегрузку PollCurrentHardwareStatus
, которая будет принимать объект CancellationToken в качестве входных данных. Функция должна регулярно проверять, запрашивается ли отмена, и корректно отменять функцию.
В этом есть несколько проблем: что это такое? что делать при запросе отмены.
Ответы соответствуют вашим требованиям. Это зависит от последовательности прерываний, которые вы должны были отменить в течение 50 мсек, или от того, может ли отмена потребоваться секунда. Например, если ваш процесс прерывается, когда оператор впервые касается вашего экрана, этот оператор, возможно, пожелает подождать полсекунды, прежде чем экран откликнется. Но если ваш процесс прерывается каждый раз, когда оператор вводит букву, одна секунда для отмены может раздражать.
Так что вопрос о том, как часто вы должны проверять отмену, зависит от использования.
async Task PollCurrentHardwareStatus(CancellatinToken token)
{
token.ThrowIfCancellationRequested();
DoSomeShortProcessing();
token.ThrowIfCancellationRequested();
DoSomeOtherProcessing();
token.ThrowIfcancellationRequested();
и т.д.
Проблема возникает, если вы вызываете функцию, для обработки которой требуется больше времени. Лучше всего было бы передать token
другому процессу:
LongProcessingFunction(token);
Другая функция должна регулярно проверять токен.
Изящно отмена зависит от этого.
Если вы не можете изменить другую функцию, вы не можете гарантировать правильную и быструю отмену.
async-await не поможет вам в этом. Программисты, которые создают ожидаемые функции для предоставления версий, которые принимают CancellationToken, должны решать программисты.
Что вы обнаружите, так это то, что все основные ожидаемые функции (чтение / запись файла, получение информации из базы данных или Интернета и т. Д.) Имеют версию, которая принимает CancellationToken.
Вы можете запустить Поток и убить этот поток при запросе отмены, но это довольно опасно, потому что вы не знаете состояние объекта, когда поток уничтожен. Я бы не советовал.