2014-02-06 3 views
0

Argh! Я вернулся, ребята! Мне не нравится беспокоить других своими проблемами, но я работаю над этим, как через 3 дня.Lidgren - InvalidOperationException не был обработан

Используя пример приложения чата, я вложил его в свою игру. Клиент и сервер подключаются соответствующим образом, но ... У моего клиента возникают некоторые проблемы. :/

public static void appendText(RichTextBox box, string line) 
    { 
     if (box == null || box.IsDisposed) 
      return; 
     //try 
     //{ 
      box.AppendText(line + Environment.NewLine); 
      ScrollRichTextBox(box); 
     //} 
     //catch 
     //{ 
     // Program.debug.print("Something went wrong."); 
     //} 
    } 

Линия AppendText продолжает выдавать исключение (InvalidOperationException). Я прокомментировал попытку, надеясь, что компилятор даст мне больше советов о том, что не так, и, может быть, как это исправить, но я не понимаю, с какой помощью.

В примерах я могу запустить этот код без получения этой ошибки. Я не знаю, где я здесь ошибся.

О, AppendText называют ...

public static void GotMessage(object peer) 
    { 
     NetIncomingMessage im; 
     while ((im = s_client.ReadMessage()) != null) 
     { 
      // handle incoming message 
      switch (im.MessageType) 
      { 
       case NetIncomingMessageType.DebugMessage: 
       case NetIncomingMessageType.ErrorMessage: 
       case NetIncomingMessageType.WarningMessage: 
       case NetIncomingMessageType.VerboseDebugMessage: 
        string text = im.ReadString(); 
        //TextControl.appendText(menuWindow.richTextBoxStatus, text); 
        Program.printStatus(text); 
        break; 

       case NetIncomingMessageType.StatusChanged: 
        NetConnectionStatus status = (NetConnectionStatus)im.ReadByte(); 

        /*if (status == NetConnectionStatus.Connected) 
         s_form.EnableInput(); 
        else 
         s_form.DisableInput(); 
        */ 

        //if (status == NetConnectionStatus.Disconnected) 
         //s_form.button2.Text = "Connect"; 

        string reason = im.ReadString(); 
        Program.printStatus(status.ToString() + ": " + reason); 
        break; 

       case NetIncomingMessageType.Data: 
        // incoming packet from the server, handle data 
        int size = im.ReadInt32(); 
        byte[] bData = im.ReadBytes(size); 

        string data = Encoding.Unicode.GetString(bData); 

        Program.debug.print(data); 
        Program.printToChat(data); 
        handleData(data); 

        break; 

       default: 
        Program.printStatus("Unhandled type: " + im.MessageType + " " + im.LengthBytes + " bytes"); 
        break; 
      } 
     } 
    } 

где PrintToChat или printStatus найдены. Эти методы содержат вызовы AppendText.

Я попытался отправить сообщение в группу Lidgren Google, когда впервые появилась ошибка, но я не получил от них ответа, поэтому я надеюсь, что люди могут получить информацию, которую я ищу. :)

Я могу предоставить дополнительную информацию и код при необходимости (как всегда, хех).

(я сделал Google, как сделать поточно-вызовы к элементам пользовательского интерфейса, но код был просто слишком запутанным, чтобы понять. Когда я наконец-то думал, что я реализовал решение, он просто отказался работать вообще ..)

+0

Несмотря на то, что это неправильное исключение, но похоже, что вы получаете доступ к RichTextBox из другого потока. Попробуйте использовать 'Invoke', когда вы вызываете' box.AppendText() '. – Sinatr

+0

Возможно, это не проблема с 'line'? Что делать, если он был пустым и/или пустым? попробуйте проверить 'if (string.IsNullOrEmpty (строка))) {return; } '. Просто чтобы быть уверенным, что нет проблемы с линией. – Iqbal

+0

@Sinatr: Как именно я бы использовал метод Invoke? Я попытался сделать то, что показал пример MSDN в самом методе AppendText, и даже если он скомпилирован, ничего не произошло, когда оно было выполнено. Я удалил этот код, но я мог бы попытаться сделать это снова. Или, может быть, я должен попробовать это в свистке GotMessage? @ Iqbal: Линия не пуста. Метод debug.print - это всего лишь более короткий способ ввода System.Console.Write для меня. Каждый раз, когда пакет принимается, консоль может печатать строку, поэтому я знаю, что она не является нулевой. – Silver

ответ

0

Pfft, посмотри на меня, разобравшись.

Мне удалось успешно добавить методы делегата в мои формы, чтобы они могли получать доступ к потокам. Или я поверила. Код теперь функционирует по назначению.

Я хотел бы добавить код, чтобы показать, что я сделал. И я буду, если кому-то понадобится помощь в этом типе проблемы. Я думаю, что могу это объяснить, но MSDN творит чудеса.

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

Мне действительно нужно прекратить задавать вопросы, в конце концов, отвечая на несколько дней спустя. :/

Я сожалею. Я чувствую себя очень плохо, когда занимаю место и трачу время.

Редактировать: Я также написал очень умный способ обхода необходимости использования делегатов. Тем не менее, для этого требуется использование таймера или цикла, который также время от времени меняет формы окна (я использовал таймер).

Смежные вопросы