作为一个学校项目,我们创建了一个C#XNA 4.0游戏,它在Visual Studio 2010本身运行时(在Release或Debug中)运行得很好。然而,当它被构建时,游戏会在某个时刻莫名其妙地崩溃。
负责的代码部分似乎是这样的:
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时,游戏就会停止响应。
这可能是什么?!
编辑:我似乎已经找到了修复,最后。在上面的Thread.Sleep(1);
循环底部添加while(true)
似乎可以解决所有问题!不知道为什么在运行EXE和从Visual Studio运行之间有什么不同,但是嘿它有效。
Edit2:此网站解释了我的整个问题:http://igoro.com/archive/volatile-keyword-in-c-memory-model-explained/ Thread.Sleep只是偶然修复了一切;)
答案 0 :(得分:1)
我怀疑将文件写入磁盘存在权限问题。当我们运行时,.exe具有与VS不同的权限。
以下是我要开始的地方:在代码中添加一些try-catch块,以便您可以找出异常发生的位置。排除故障时,在屏幕上显示异常详细信息。
作为临时调试策略,您还可以尝试这样做:添加某种日志记录并记录此处的每一步。在行if( Client.readInfo )
之后,测试您已到达该行。在行string toWrite = IPinput.filledIn;
之后查看字符串toWrite的内容,依此类推。
如果您只是出于调试目的,可以在屏幕上将这些消息丢给自己。我不熟悉XNA,但在任何旧的Web应用程序中,您通常可以使用Response.Write
执行此操作。
一旦缩小确切问题的位置,就可以进一步测试它是什么。当你修复它时,当然,你删除了所有这些代码。
答案 1 :(得分:1)
很难从您发布的代码中了解到,但我认为您需要Client.readInfo
字段volatile
。 Thread.Sleep
解决问题的原因是它将内存障碍视为副作用。