问题仅在制作发布版本并运行exe文件时出现(不是来自visual studio) 在所有其他组合中,无论是从visual studio运行还是运行exe,一切正常
我正在使用backgroundWorker
运行Function Load负载:
while (!Request.GAMELIST.XMLReceived) ;
GameEngine.ParseGameList( Request.GAMELIST.XML );
Request.GAMELIST.XMLReceived = false;
while此片段中的循环就像延迟一样 它应该等到从服务器收到XML然后继续 但它坚持上述指定的情况
如果我要放MessageBox.show(“我们走了”);在while循环之后 messageBox不会出现 但如果我把MessageBox.show(“我们走了”);在while循环之前 应用程序将接收数据,直到我单击消息框确定 然后一切都会正常工作
这里是GAMELIST类实现
public class RequestGAMELIST
{
public string XML;
public bool XMLReceived = false;
public void ParseRequest( string request )
{
int index = request.IndexOf(':') + 2;
XML = request.Substring(index, request.Length - index);
XMLReceived = true;
}
}
如果可以,请提供帮助 这是我自己无法弄明白的奇怪的事情
感谢。
答案 0 :(得分:4)
是的,这段代码在Release版本中挂起的几率非常高。 JIT优化器不知道该方法之外的代码可能将该变量设置为true。你需要告诉它,像这样:
public class RequestGAMELIST
{
public volatile bool XMLReceived = false;
// etc..
}
volatile关键字确保抖动不会将变量值存储在CPU寄存器中。
这解决了你的问题,它仍然不是正确的方法。您应该使用AutoResetEvent。它确保线程尽可能快地响应变量更改。最重要的是,它允许线程阻塞,因此它不会烧掉任何cpu周期。
public class RequestGAMELIST
{
public AutoResetEvent XMLReceived = new AutoResetEvent();
public void ParseRequest( string request )
{
int index = request.IndexOf(':') + 2;
XML = request.Substring(index, request.Length - index);
XMLReceived.Set();
}
}
在你的主题中:
XMLReceived.WaitOne();
GameEngine.ParseGameList( Request.GAMELIST.XML );
答案 1 :(得分:2)
这是糟糕的想法:
while (!Request.GAMELIST.XMLReceived) ;
至少你应该这样做:
while (!Request.GAMELIST.XMLReceived) {
System.Threading.Thread.Sleep(100); // Don't hog the CPU!
}
您的程序在调试模式下运行正常可能是因为在while循环中添加了某些调试例程,这使得它运行得更慢......