В настоящее время я занимаюсь модификацией наших долговременных методов, чтобы их можно было отменить. Я планирую использовать System.Threading.Tasks.CancellationToken для реализации этого.
Наши методы обычно выполняют несколько длительных шагов (в основном отправка команд и затем ожидание оборудования), например.
void Run()
{
Step1();
Step2();
Step3();
}
Моя первая (может быть, глупая) мысль об отмене превратила бы это в
bool Run(CancellationToken cancellationToken)
{
Step1(cancellationToken);
if (cancellationToken.IsCancellationRequested)
return false;
Step2(cancellationToken);
if (cancellationToken.IsCancellationRequested)
return false;
Step3(cancellationToken);
if (cancellationToken.IsCancellationRequested)
return false;
return true;
}
что откровенно выглядит ужасно. Этот «шаблон» будет продолжаться и внутри отдельных шагов (и они обязательно уже довольно длинные). Это сделало бы Thread.Abort() довольно привлекательным, хотя я знаю, что это не рекомендуется.
Существует ли более чистый шаблон для достижения этого, который не прячет логику приложения под большим количеством стандартного кода?
Изменить
В качестве примера характера шагов метод Run
может читаться
void Run()
{
GiantRobotor.MoveToBase();
Oven.ThrowBaguetteTowardsBase();
GiantRobotor.CatchBaguette();
// ...
}
Мы управляем различными аппаратными блоками, которые необходимо синхронизировать для совместной работы.
Step(int number)
? Так что вы можете пройти от 1 до 3 и проверить, запрашивается ли токен отмены только один раз? - person azz   schedule 05.11.2013Thread.Abort()
и критическими секциями? Тогда вам нужно будет только мьютексировать критический код (возможно, с сохранением состояния) и позволить Thread.Abort() убить все остальное. - person neeKo   schedule 05.11.2013Promise
объекты, но я не уверен, существует ли существующая реализация, учитывающая многопоточность. - person zzzzBov   schedule 06.11.2013Maybe
Monad. Кажется, хорошее концептуальное соответствие. - person CamilB   schedule 06.11.2013Task
(которые могут быть самими монадами, я не привык с ними работать). - person Jens   schedule 06.11.2013