2015-03-11 9 views
0

Я создаю генератор отчетов, который позволяет пользователю сделать две простые вещи:C# - Разрешение Метод Прервать Асинхронный

  1. Начало генерации отчета.
  2. Отменить генерацию отчета во время выполнения.

Для целей единичного тестирования я выделил бизнес-логику. Испытательная установка для метода прерывания содержит следующий код:

reportGenerator.GenerateReport(); 
reportGenerator.Abort(); 

метод прерывания просто устанавливает приватное поле маркировки, было ли называется преждевременное прекращение:

public void Abort() 
{ 
    aborted = true; 
} 

внутри GenerateReport начинается новый поток на котором исполняются кишки генерации отчета, проверяя флаг прерывания в нескольких местах на этом пути.

Проблема я встречая, что мой блок тест даже не выполняя метод прерывания до после GenerateReport() заканчивает выполнение, таким образом, флаг прерывания только будучи установлен после завершения выполнения.

Я считаю, что проблема связана с вызовами GenerateReport() и Abort() из одного потока в модульном тесте. Похоже, что если я создам новый поток в модуле Test Test и вызову GenerateReport() из нового потока, я бы смог асинхронно вызывать метод прерывания, однако кажется бесполезным создавать поток вне всех моя бизнес-логика.

Если у кого-то есть предложения или ответы на лучший способ сделать то, что я пытаюсь сделать, было бы весьма полезно!

+2

Вы должны запускать ту или иную другую тему. Тот же поток не может прервать себя! Вы можете либо запустить 'GenerateReport()' как задачу в другом потоке, либо запустить задачу, которая будет вызывать 'Abort()' после некоторой задержки. Но так или иначе, если вы хотите протестировать эту функциональность, вам нужно иметь два разных потока, работающих над проблемой. \ –

+0

Возможно, что другой поток не видит изменения в переменной прерывания (или отсутствует порядка с чем-то еще, что проверено - что более вероятно на x86). Но, трудно сказать, без кода, который показывает проверку прерывающей переменной. Как правило, я предлагаю использовать CancellationTokenSource вместо переменной, подобной этой, из-за проблем синхронизации, с которыми вам приходится иметь дело самостоятельно. –

+0

Существует шаблон общего назначения для отмены задач, которые включают в себя «CancellationTokenSource» и «CancellationToken's», предоставленные им. И вы, вероятно, должны его использовать. – Spo1ler

ответ

0

Вы ответили на свой вопрос с:

Я считаю, что этот вопрос должен делать как с GenerateReport() и Abort() вызывается из того же потока в Test Unit.

Вы не можете отключить нить, что не имеет смысла. Вы могли бы выполнить свою задачу, только если у вас было два потока.

Рассмотрите , почему вам нужно Это, в первую очередь. Если вы хотите реагировать на пользовательский интерфейс во время генерации отчета, вы должны создать новый поток в коде пользовательского интерфейса, определенно не свою бизнес-логику. Вы, скорее всего, выиграете от класса BackgroundWorker.

 Смежные вопросы

  • Нет связанных вопросов^_^