Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 仅在发布版本中存在C应用程序问题_C#_Visual Studio 2008_Build_Release - Fatal编程技术网

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

C# 仅在发布版本中存在C应用程序问题,c#,visual-studio-2008,build,release,C#,Visual Studio 2008,Build,Release,该问题仅在生成发布版本并运行exe文件时出现,而不是在visual studio中 在所有其他组合中,无论是从VisualStudio运行还是运行exe,一切都正常 我正在使用backgroundWorker运行函数加载 负载: 而这个片段中的循环就像延迟一样工作 它应该等到从服务器接收到XML后再继续 但它在上述特定情况下受阻 如果我把MessageBox.show放在这里;while循环之后 messageBox将不会出现 但是如果我把MessageBox.show放在这里,我们就开始了;前

该问题仅在生成发布版本并运行exe文件时出现,而不是在visual studio中 在所有其他组合中,无论是从VisualStudio运行还是运行exe,一切都正常

我正在使用backgroundWorker运行函数加载

负载:

而这个片段中的循环就像延迟一样工作 它应该等到从服务器接收到XML后再继续 但它在上述特定情况下受阻

如果我把MessageBox.show放在这里;while循环之后 messageBox将不会出现 但是如果我把MessageBox.show放在这里,我们就开始了;前while循环 应用程序将接收数据,直到我单击messagebox ok 然后一切都会好起来

下面是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;
    }
}
如果可以,请提供帮助 这真是件奇怪的事,我自己也搞不懂

谢谢。

这是个坏主意:

至少你应该这样做:

while (!Request.GAMELIST.XMLReceived) {
  System.Threading.Thread.Sleep(100);  // Don't hog the CPU!
}
您的程序在调试模式下运行良好,这可能是由于在while循环中添加了某些调试例程,使其运行较慢…

这是一个坏主意:

至少你应该这样做:

while (!Request.GAMELIST.XMLReceived) {
  System.Threading.Thread.Sleep(100);  // Don't hog the CPU!
}

您的程序在调试模式下运行良好,这可能是由于在while循环中添加了某些调试例程,使其运行较慢……

是的,此代码很可能挂起在发布版本中。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 );

是的,这段代码在发布版本中很有可能被挂起。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 );

根据所使用的类/API,如果代码正在等待来自服务器的消息,那么调用中应该有一个同步原语可用。特别是在资源有限的线程中运行时,您绝对不应该通过运行紧循环而不让步地占用CPU。你的CPU或CPU上运行的核心将一直处于100%的利用率。是的,我错了,问题是CPU使用率错误,你说至少你应该做一些事情,比如你知道更好的解决方案吗?我试过了!Request.GAMELIST.XMLReceived{Thread.Sleep100;}但它仍然存在问题。在这种情况下,很明显,在为发行版构建时,优化器对变量Request.GAMELIST.XMLReceived进行了优化。它必须是一个编译器认为永远不会更改的变量,即始终为false,因此它只是将其优化为无限循环。该变量是否由其他库代码设置?也许您应该将此变量标记为volatile。根据所使用的类/API,如果代码正在等待来自服务器的消息,那么调用中应该有一个同步原语。特别是在资源有限的线程中运行时,你绝对不应该在不让步的情况下运行一个紧密的循环来占用CPU。你的CPU或CPU上运行的核心将一直处于100%的利用率。是的,我错了,问题是CPU使用率错误,你说至少你应该做一些事情,比如你知道更好的解决方案吗?我试过了!Request.GAMELIST.XMLReceived{Thread.Sleep100;}但它仍然存在问题。在这种情况下,很明显,在为发行版构建时,优化器对变量Request.GAMELIST.XMLReceived进行了优化。它必须是一个编译器认为永远不会更改的变量,即始终为false,因此它只是将其优化为无限循环。该变量是否由其他库代码设置?也许您应该将此变量标记为volatile。尝试将XMLReceived设置为volatile,但绝对应该考虑使用基于事件的系统而不是循环。尝试将XMLReceived设置为volatile,但绝对应该考虑使用基于事件的系统而不是循环。谢谢,这看起来是非常酷的解决方案。我以前从未听说过AutoResetEvent。是的,等等;自动取消设置?谢谢,我将尝试解决方案并编写结果,就是这样
自动意味着。与手动重置事件相反,它需要自己调用重置。@Hans Passant我尝试过,但仍然没有成功。知道如果我在函数中的任何地方弹出消息框,它将不会出现。你不会给我任何帮助。学习如何编写线程安全的代码确实需要几个月的时间,我想你才刚刚开始。WaitOne会阻止当前线程吗?即使是挥发性bool溶液也不起作用,这看起来很酷。我以前从未听说过AutoResetEvent。是的,等等;自动取消设置?谢谢,我将尝试解决方案并编写结果,这就是“自动”的含义。与手动重置事件相反,它需要自己调用重置。@Hans Passant我尝试过,但仍然没有成功。知道如果我在函数中的任何地方弹出消息框,它将不会出现。你不会给我任何帮助。学习如何编写线程安全的代码确实需要几个月的时间,我想你才刚刚开始。WaitOne会阻止当前线程吗?即使是挥发性bool溶液也不起作用