作为一个学校项目,我们创建了一个 C# XNA 4.0 游戏,该游戏在从 Visual Studio 2010 本身运行(无论是发布版还是调试版)时都能完美运行。然而,当它构建完成后,游戏在某个时刻莫名其妙地崩溃了。
负责的代码部分似乎是这样的:
while( true )
{
if( Client.readInfo )
{
t.Stop();
t.Dispose();
// Save last good IP to file
string toWrite = IPinput.filledIn;
using( StreamWriter file = new StreamWriter( "multiplayer.dat", false ) )
{
file.WriteLine( toWrite );
}
ExitScreen();
using( LobbyScreen screen = new LobbyScreen( c ) )
{
screenManager.AddScreen( screen );
}
break;
}
else if( itTookToLong )
{
Client.killMe = true;
IPinput.Text = "Server IP: ";
IPinput.filledIn = "";
break;
}
}
这会等到启动的客户端线程使公共静态属性 readInfo 为 true(发生这种情况,因为服务器获取客户端)或计时器在 10 秒后耗尽。当通过 VS 运行时,这两件事都工作得很好,但当作为构建的 EXE 运行时,游戏就会停止响应。
这可能是什么?
Edit:我似乎终于找到了解决办法。添加Thread.Sleep(1);
在上面的底部while(true)
循环似乎可以解决所有问题!虽然不知道为什么运行 EXE 和从 Visual Studio 运行不同,但它确实有效。
Edit2:这个网站解释了我的整个问题:http://igoro.com/archive/volatile-keyword-in-c-memory-model-explained/ http://igoro.com/archive/volatile-keyword-in-c-memory-model-explained/Thread.Sleep 只是意外地修复了所有问题;)
很难从您发布的代码中看出,但我相信您需要制作Client.readInfo
field volatile
。原因是Thread.Sleep
解决你的问题是它会产生内存障碍作为副作用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)