我需要一个简单的 bool 来通知一个长时间运行的进程作为循环的一部分中止,如下所示:
bool Abort = false;
void MyLongRunningMethod()
{
while(true)
{
// loop code goes here, takes 2 hours ish to run
if(Abort)
break;
}
}
我知道如何正确地编写它,但我想知道,如果我将它保留原样,会有任何风险吗?或者是唯一的风险(在我的情况下这不是问题)循环可能会运行额外的时间(在写入 bool 的同时读取它)。
我是否遗漏了任何奇怪的边缘情况,或者如果我对以下声明没问题,这实际上完全没问题:“当中止为真时,该方法应该中断,但可能会在它之后运行额外的时间而没有副作用”?还是我错过了可以彻底打破那里世界的东西?
首先,这里的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)
我是一名优秀的程序员,十分优秀!