我需要一个简单的bool来将一个长时间运行的进程通知abord作为循环的一部分,如下所示:
bool Abort = false;
void MyLongRunningMethod()
{
while(true)
{
// loop code goes here, takes 2 hours ish to run
if(Abort)
break;
}
}
我知道如何正确地写这个,但是我想知道,如果我把它保留下来有任何风险吗?或者是唯一的风险(在我的情况下这是一个非问题)循环可以运行一个额外的时间(在写入的同时读取bool)。
我错过了任何奇怪的边缘情况,或者这实际上完全没问题,如果我对下面的陈述没问题:“当abort为真时该方法应该会中断,但是在没有副作用的情况下可能会再运行一次”?或者我错过了一些可以彻底打破世界的东西?
答案 0 :(得分:5)
首先,此处的bool
应标记为volatile
以创建内存屏障/防止某些缓存给您带来误报。其次,CancellationTokenSource
是一个很好的替代方案:
private readonly CancellationTokenSource _cancel = new CancellationTokenSource();
void MyLongRunningMethod()
{
while (!_cancel.IsCancellationRequested)
{
// loop code goes here, takes 2 hours ish to run
}
}
然后停止循环:
_cancel.Cancel();
如果您希望按原来的方式保留,请while (!Abort)
代替while (true)