我目前正在改进我们的长期运行方法,使其可以取消。我打算使用 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();
// ...
}
我们正在控制需要同步才能协同工作的不同硬件单元。