В чем разница между работой в VS 2010 и сборкой EXE? - PullRequest
2 голосов
/ 07 июня 2011

В качестве школьного проекта мы создали игру 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.

Что бы это могло быть ?!

Редактировать: Кажется, я уже нашел исправление, НАКОНЕЦ.Добавление Thread.Sleep(1); внизу вышеуказанного цикла while(true), похоже, решает все проблемы!Не знаю, почему это отличается от запуска EXE и запуска из Visual Studio, но эй, это работает.

Edit2: Этот сайт объясняет всю мою проблему: http://igoro.com/archive/volatile-keyword-in-c-memory-model-explained/ Thread.Sleep просто случайно все исправил;)

Ответы [ 2 ]

1 голос
/ 07 июня 2011

Трудно сказать по коду, который вы разместили, но я считаю, что вам нужно сделать Client.readInfo поле volatile.Причина, по которой Thread.Sleep устранила вашу проблему, заключается в том, что в качестве побочного эффекта он устанавливает барьер памяти.

1 голос
/ 07 июня 2011

Я подозреваю, что проблема с разрешениями для записи файла на диск..Exe имеет другие разрешения при запуске, чем VS.

Вот где я бы начал: добавить несколько блоков try-catch в ваш код, чтобы вы могли выяснить, где исключениепроисходит.Во время устранения неполадок отобразите подробности исключения на экране.

В качестве стратегии временной отладки вы также можете попробовать это: добавить какую-либо запись в журнал и записывать каждый шаг по пути.Сразу после строки if( Client.readInfo ) проверьте, что вы достигли этой линии.Сразу после строки string toWrite = IPinput.filledIn; посмотрите содержимое строки toWrite и т. Д.

Если вы хотите, просто для целей отладки, вы можете выбросить эти сообщения себе на экран.Я не знаком с XNA, но в любом старом веб-приложении вы обычно можете сделать это с помощью Response.Write.

Как только вы определитесь с точной проблемой, вы можете проверить, что это такое.И когда вы исправите это, конечно, вы удалите весь этот код.

...