2011-06-07 31 views
2

作为一个学校项目,我们创建了一个C#XNA 4.0游戏,它可以从Visual Studio 2010本身运行(在Release或Debug中)完美运行。但是,当它建成时,游戏在某个时候莫名其妙地崩溃。在VS 2010中运行和运行构建的EXE有什么区别?

该负责代码部分似乎是这样的:

 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真(这恰好,因为服务器获取客户端)或者时间用完10秒后。当通过VS运行时,这两件事情都可以很好地工作,但游戏只是在以构建的EXE运行时停止响应。

这是什么?!

编辑:我似乎已经找到了修复程序,最后。在上面的while(true)循环的底部添加Thread.Sleep(1);似乎可以解决所有问题!不知道为什么在运行EXE和从Visual Studio运行之间有所不同,但是嘿它有效。

EDIT2:该网站介绍了我的整个问题:http://igoro.com/archive/volatile-keyword-in-c-memory-model-explained/ 的Thread.Sleep只是偶然的一切问题;)

+0

XNA是否真的以这种方式暴露TCP/IP协议栈?这可能是因为你试图使用XNA中实际不存在的类。我只隐约回忆几年前使用XNA,所以,呃... – Frosty840 2011-06-07 08:35:46

回答

1

很难从您发布的代码中分辨出来,但我相信您需要制作Client.readInfo字段volatileThread.Sleep解决了你的问题的原因是,它将记忆障碍作为副作用。

+0

你可能是对的!我真的不知道关键字。虽然现在已经修好了,但我会牢记:) – Venorcis 2011-06-07 10:42:44

+0

哇,这确实是我确切的问题,我猜:http://igoro.com/archive/volatile-keyword-in-c-memory-model-explained/ – Venorcis 2011-06-07 10:46:56

1

我怀疑是有问题的权限将文件写入到磁盘。当我们运行VS.时,.exe具有不同的权限。

这里是我要开始的地方:在你的代码中添加一些try-catch块,这样你就可以找出异常发生的位置。在排除故障时,在屏幕上显示异常详情。

作为临时调试策略,您也可以尝试这样:添加某种记录并记录此处的每一步。在行if(Client.readInfo)后面,测试您是否已到达该行。在行string toWrite = IPinput.filledIn;后面查看字符串toWrite的内容,依此类推。

如果您宁愿为了调试目的而将这些消息放到屏幕上。我对XNA并不熟悉,但在任何旧的Web应用程序中,您通常可以使用Response.Write来完成此操作。

一旦你缩小了确切问题的位置,你可以进一步测试它是什么。当你修复它,当然,你删除所有这些代码。

+0

嘿!非常感谢您的回答!写入文件没有出错,因为1:所有异常都被捕获,2:设置文件完美工作。阅读我自己的答案为实际解决方案。 – Venorcis 2011-06-07 09:00:02

+0

我似乎已经找到了修复程序,最后。 不能添加它,所以我会在这里发布它:添加Thread.Sleep(1);在上面的while(true)循环的底部似乎解决了所有问题!不知道为什么运行EXE和从Visual Studio运行不同,但这是有效的 – Venorcis 2011-06-07 09:05:34

+0

@Venorcis:干得好!我将编辑您的问题以包含此解决方案。编辑你的问题对你来说完全没问题。我会为你做。这将有助于任何人前来,并没有意识到你的聪明解决方案是埋在这里。 – DOK 2011-06-07 09:08:09

相关问题