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函数,这种支持可能会变得有用。如果我在这里遗漏了什么,请有人澄清。