C# - разрешить метод прерывания асинхронно
Я создаю генератор отчетов, который позволяет пользователю делать две простые вещи:
- Начать генерацию отчета.
- Прервите создание отчета во время выполнения.
Для целей модульного тестирования я выделил бизнес-логику. Модульный тест для метода abort содержит следующий код:
reportGenerator.GenerateReport();
reportGenerator.Abort();
Метод abort просто устанавливает приватное поле, указывающее, была ли вызвана прерывание:
public void Abort()
{
aborted = true;
}
Внутри GenerateReport запускается новый поток, в котором выполняются внутренности генерации отчета, проверяя флаг сброса в нескольких местах по пути.
Проблема, с которой я сталкиваюсь, состоит в том, что мой модульный тест даже не выполняет метод abort до тех пор, пока не завершится выполнение GenerateReport(), таким образом, флаг abort устанавливается только после завершения выполнения.
Я считаю, что проблема связана с вызовом GenerateReport() и Abort() из одного потока в модульном тесте. Похоже, что если я создам новый поток в коде модульного теста и вызову GenerateReport() из нового потока, я смог бы асинхронно вызывать метод abort, однако кажется, что создавать поток вне всех моя бизнес логика.
Если у кого-нибудь есть какие-либо предложения или ответы о том, как лучше всего делать то, что я пытаюсь сделать, это будет с благодарностью!
1 ответ
Вы ответили на свой вопрос:
Я считаю, что проблема связана с вызовом GenerateReport() и Abort() из одного потока в модульном тесте.
Вы не можете позволить себе прервать поток, это не имеет смысла. Вы могли бы выполнить свою задачу, только если у вас было два потока.
Подумайте, зачем вам это нужно в первую очередь. Если вы хотите адаптивный пользовательский интерфейс во время генерации отчета, вы должны создать новый поток в коде пользовательского интерфейса, определенно не вашу бизнес-логику. Вы, скорее всего, выиграете от BackgroundWorker
учебный класс.