C# 如何立即将类的状态传播到子线程?

C# 如何立即将类的状态传播到子线程?,c#,task-parallel-library,volatile,C#,Task Parallel Library,Volatile,我有一个类,其中我正在生成几个线程来做一些工作。现在,我希望能够在发生事件时停止工作。事件处理程序在派生类中设置一个字段,例如(中断)。在For Each的委托中,我在继续下一次迭代之前检查这个标志 public bool Interrupted { get; set; } Parallel.ForEach(some collection){ if (Interrupted) { paral

我有一个类,其中我正在生成几个线程来做一些工作。现在,我希望能够在发生事件时停止工作。事件处理程序在派生类中设置一个字段,例如(中断)。在For Each的委托中,我在继续下一次迭代之前检查这个标志

public bool Interrupted { get; set; }

Parallel.ForEach(some collection){
if (Interrupted)
                        {
                            parallelLoopState.Break();
                            return;
                        }
    else 
    DoSomething();

}
现在,在父线程上将once Interrupted设置为true。它对Parallel.Foreach生成的线程是否可见?还是需要一段时间才能看到

我的测试间歇性地失败,这表明即使在父线程设置了标志之后,子线程也会执行几次? 我缺少一些基本的东西吗


这是Volatile的用例场景吗?

在传递给parallel.ForEach方法的代码块上有并行执行。因此,当主线程将其设置为true时,一些线程将刚刚通过if(Interrupted)测试。只有foreach循环的后续执行才会捕获它。

在传递给parallel.foreach方法的代码块上有并行执行。因此,当主线程将其设置为true时,一些线程将刚刚通过if(Interrupted)测试。只有foreach循环的后续执行才会捕获它。

我不会对其他线程中中断的
更改的可见性做出任何假设。你只需要做最坏的打算。您必须添加显式同步,以确保对属性的更改对
并行
循环构造立即可见


说到这里,我怀疑“子线程执行了几次”的观察结果是设置
中断
和读取它之间的竞争的结果。请记住,
Parallel.ForEach
可能会有许多线程执行该工作,因此所有在更改前通过读取的线程仍将继续执行
DoSomething

我不会对其他线程中的
中断的
更改的可见性做出任何假设。你只需要做最坏的打算。您必须添加显式同步,以确保对属性的更改对
并行
循环构造立即可见


说到这里,我怀疑“子线程执行了几次”的观察结果是设置
中断
和读取它之间的竞争的结果。请记住,
Parallel.ForEach
可能会有许多线程执行该工作,因此所有在更改前通过读取的线程仍将继续执行
DoSomething

我的疑问是,该字段变量中的更改是否会在ForEach循环的后续执行中可见?或者在子线程看到它之前可能需要执行2-3次以上的操作,可能是因为一些编译器优化?我的疑问是,这个字段变量的更改是否会在foreach循环的后续执行中可见?或者可能需要再执行2-3次才能对子线程可见,这可能是因为某些编译器优化的缘故?