2011-06-07 28 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

相關問題