编辑:我知道这是错误的代码,这就是我用anti-pattern
标记它的原因。
好的,这是我今天发现的一些实际的真实代码:
public class ServiceWrapper
{
bool thingIsDone = false; //class variable.
//a bunch of other state variables
public string InvokeSoap(methodArgs args)
{
//blah blah blah
soapClient client = new Client();
client.doThingCompleted += new doThingEventHandler(MycompletionMethod);
client.doThingAsync(args);
do
{
string busyWork = "";
}
while (thingIsDone == false)
//do some more stuff
}
private void MyCompletionMethod(object sender, completedEventArgs e)
{
//do some other stuff
thingIsDone = true;
}
}
好的,所以我明白为什么这很糟糕。但实际上让我问这个问题的是thingIsDone
true
方法InvokeSoap
似乎永远不会MyCompletionMethod
,即使Thread.Sleep(100)
中设置为true,但只有{em>在发布中得到遵守。它的行为与调试模式中的“期望”相同。
在while
循环中添加l=re.sub(' ', '', l)
也可以修复它。怎么了?
答案 0 :(得分:4)
CPU可以缓存thingIsDone
的值,因为该线程无法在读取之间进行更改。
您需要volatile
强制发布写入,以便其他线程可以读取它。
答案 1 :(得分:0)
您可以在循环中使用Thread.Yield()
。
do
{
string busyWork = "";
Thread.Yield();
}
while (thingIsDone == false)