仅在发布版本中的C#应用​​程序问题

时间:2011-03-14 11:46:58

标签: c# visual-studio-2008 build release

问题仅在制作发布版本并运行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;
    }
}

如果可以,请提供帮助 这是我自己无法弄明白的奇怪的事情

感谢。

2 个答案:

答案 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循环中添加了某些调试例程,这使得它运行得更慢......