У меня есть класс, который является классом «менеджера». Одна из его функций - сигнализировать о том, что длительный процесс класса должен быть отключен. Он делает это, устанавливая логическое имя «IsStopping» в классе.Как отменить глубоко вложенный процесс
public class Foo
{
bool isStoping
void DoWork() {
while (!isStopping)
{
// do work...
}
}
}
Теперь DoWork() была гигантская функция, и я решил реорганизовать это и как часть процесса сломал некоторые из них в другие классы. Проблема в том, что некоторые из этих классов также имеют длинные функции, которые необходимо проверить, является ли isStopping истинным.
public class Foo
{
bool isStoping
void DoWork() {
while (!isStopping)
{
MoreWork mw = new MoreWork()
mw.DoMoreWork() // possibly long running
// do work...
}
}
}
Какие у меня варианты?
Я рассмотрел прохождение isStopping по ссылке, что мне не очень нравится, потому что для этого требуется внешний объект. Я бы предпочел сделать дополнительные классы как самостоятельными, так и свободными как можно более свободными.
Я также рассмотрел возможность создания isStopping свойства, а затем, когда он вызывает событие, на которое могут быть подписаны внутренние классы, но это кажется слишком сложным.
Другим вариантом было создать класс «Токмен процесса отмены», аналогичный тому, что использует .net 4 Tasks, затем этот токен передается этим классам.
Как вы справились с этой ситуацией?
EDIT:
считают также, что MoreWork может иметь объект EvenMoreWork, что он создает и вызывает потенциально долго работает метод на ... и так далее. Я предполагаю, что то, что я ищу, - это способ оповестить произвольное количество объектов вниз по дереву вызовов, чтобы сказать им прекратить то, что они делают, очистить и вернуть.
EDIT2:
Спасибо за ответы до сих пор. Похоже, что нет реального согласия в отношении методов использования, и у каждого другое мнение. Похоже, что это должен быть шаблон дизайна ...
Использование потоков или без потоков? Потому что ИМО, если что-то подобное не многопоточно, трудно увидеть сценарий. – Marcote
Нитки или нет в значительной степени неактуальны. Он может быть установлен с помощью сообщения Windows, для isntance, в однопоточном приложении, в котором есть сообщение. Однако да, моя конкретная реализация использует потоки. –