使用交叉线程布尔值中止线程

时间:2010-03-25 09:08:08

标签: c# .net multithreading .net-3.5 c#-3.0

假设我们有这段代码:

bool KeepGoing = true;
DataInThread = new Thread(new ThreadStart(DataInThreadMethod));
DataInThread.Start();
//bla bla time goes on
KeepGoing = false;

private void DataInThreadMethod()
{
      while (KeepGoing)
      {
         //Do stuff
      }
   }
}

现在的想法是使用布尔值是一种终止线程的安全方法,但是因为调用线程上存在布尔值会导致任何问题吗?

该布尔值仅用于调用线程以停止线程,因此它不像在其他地方使用

2 个答案:

答案 0 :(得分:2)

您需要明确 / KeepGoing的位置,但不是;这不安全。它可以保存在x86上的寄存器中(但在大多数非平凡的例子中这不太可能)。您需要将其volatile或同步(lock等)访问它。例如,see here

答案 1 :(得分:0)

希望我不会对此答案感到满意,但是:

Jon的Worker class示例可以替代您正在做的事情,这是线程安全的。我用while(boolVariable)方法发现的两个问题是某些任务比其他任务花费的时间更长(假设您执行多个任务),这意味着直到该任务结束才会捕获停止。另一个是当你到达循环结束时会发生什么?或许打破,或者只是永远地重复那个任务,如果您正在下载文件列表,那么这并不总是您想要的。