Я создаю генератор отчетов, который позволяет пользователю сделать две простые вещи:C# - Разрешение Метод Прервать Асинхронный
- Начало генерации отчета.
- Отменить генерацию отчета во время выполнения.
Для целей единичного тестирования я выделил бизнес-логику. Испытательная установка для метода прерывания содержит следующий код:
reportGenerator.GenerateReport();
reportGenerator.Abort();
метод прерывания просто устанавливает приватное поле маркировки, было ли называется преждевременное прекращение:
public void Abort()
{
aborted = true;
}
внутри GenerateReport начинается новый поток на котором исполняются кишки генерации отчета, проверяя флаг прерывания в нескольких местах на этом пути.
Проблема я встречая, что мой блок тест даже не выполняя метод прерывания до после GenerateReport() заканчивает выполнение, таким образом, флаг прерывания только будучи установлен после завершения выполнения.
Я считаю, что проблема связана с вызовами GenerateReport() и Abort() из одного потока в модульном тесте. Похоже, что если я создам новый поток в модуле Test Test и вызову GenerateReport() из нового потока, я бы смог асинхронно вызывать метод прерывания, однако кажется бесполезным создавать поток вне всех моя бизнес-логика.
Если у кого-то есть предложения или ответы на лучший способ сделать то, что я пытаюсь сделать, было бы весьма полезно!
Вы должны запускать ту или иную другую тему. Тот же поток не может прервать себя! Вы можете либо запустить 'GenerateReport()' как задачу в другом потоке, либо запустить задачу, которая будет вызывать 'Abort()' после некоторой задержки. Но так или иначе, если вы хотите протестировать эту функциональность, вам нужно иметь два разных потока, работающих над проблемой. \ –
Возможно, что другой поток не видит изменения в переменной прерывания (или отсутствует порядка с чем-то еще, что проверено - что более вероятно на x86). Но, трудно сказать, без кода, который показывает проверку прерывающей переменной. Как правило, я предлагаю использовать CancellationTokenSource вместо переменной, подобной этой, из-за проблем синхронизации, с которыми вам приходится иметь дело самостоятельно. –
Существует шаблон общего назначения для отмены задач, которые включают в себя «CancellationTokenSource» и «CancellationToken's», предоставленные им. И вы, вероятно, должны его использовать. – Spo1ler