public void MyTest()
{
  bool eventFinished = false;

  myEventRaiser.OnEvent += delegate { doStuff(); eventFinished = true; };
  myEventRaiser.RaiseEventInSeperateThread()

  while(!eventFinished) Thread.Sleep(1);

  Assert.That(stuff);
}

为什么eventFinished不能是可变的,这有关系吗?

在我看来,在这种情况下,编译器或运行时可能会出于自身的利益而变得聪明,并且在while循环中“知道” eventFinished只能为false。尤其是当您考虑将提升的变量作为类的成员生成而将委托(delegate)作为同一类的方法生成时,从而使优化失去了eventFinished曾经是局部变量这一事实。

最佳答案

存在一个线程原语 ManualResetEvent 来精确地完成此任务-您不想使用 bool 标志。

像这样的事情应该做的工作:

public void MyTest()
{
    var doneEvent = new ManualResetEvent(false);

    myEventRaiser.OnEvent += delegate { doStuff(); doneEvent.Set(); };
    myEventRaiser.RaiseEventInSeparateThread();
    doneEvent.WaitOne();

    Assert.That(stuff);
}

关于缺少对局部变量的volatile关键字的支持,我不认为有任何理由在C#中理论上不可能做到这一点。很可能不仅仅因为在C#2.0之前就没有使用该功能而支持它。现在,由于存在匿名方法和lambda函数,这种支持可能会变得有用。如果我在这里遗漏了什么,请有人澄清。

10-06 13:34