我有一个 UI,它产生一个后台工作线程,该线程执行一个复杂的任务树和子任务,大约需要一分钟才能完成。
一个要求是后台工作任务必须能够在它开始后被取消。
目前我的解决方案很幼稚,使代码变得一团糟。在 UI 中按下取消按钮时,将设置取消令牌。工作线程定期(在任务之间)轮询此令牌,如果已设置,则退出:
void ThreadWorkerHandler(CancelToken cancelToken)
{
DoTask1(cancelToken);
if (cancelToken.IsSet)
return;
DoTask2(cancelToken);
if (cancelToken.IsSet)
return;
DoTask3(cancelToken);
if (cancelToken.IsSet)
return;
DoTask4(cancelToken);
}
void DoTask2(CancelToken cancelToken)
{
DoSubTask2a();
if (cancelToken.IsSet)
return;
DoSubTask2b();
if (cancelToken.IsSet)
return;
DoSubTask2c();
if (cancelToken.IsSet)
return;
}
有更好的解决方案吗?我正在玩类似 SoLongAs 语句的东西,它会自动插入检查并在满足条件时自动引发内部异常,这将在循环结束时在内部被捕获,例如:
void ThreadWorkerHandler(CancelToken cancelToken)
{
SoLongAs (canelToken.IsSet == false)
{
DoTask1(cancelToken);
DoTask2(cancelToken);
DoTask3(cancelToken);
DoTask4(cancelToken);
}
}
但我想由于某种原因这行不通,更重要的是我怀疑这样的事情是否真的存在。如果没有,有没有比我目前使用的更好的方法来处理这种情况?谢谢。