C# - разрешить метод прерывания асинхронно

Я создаю генератор отчетов, который позволяет пользователю делать две простые вещи:

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

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

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

Метод abort просто устанавливает приватное поле, указывающее, была ли вызвана прерывание:

public void Abort()
{
    aborted = true;
}

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

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

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

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

1 ответ

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

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

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

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

Другие вопросы по тегам