Lidgren - InvalidOperationException не было обработано

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

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

    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). Я прокомментировал try-catch, надеясь, что компилятор даст мне больше советов о том, что не так и, возможно, как это исправить, но я не могу найти его с его помощью.

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

О, 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.

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

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

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

1 ответ

Решение

Пффф, посмотри на меня, разберись.

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

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

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

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

Мне очень жаль. Мне очень жаль, что я занимаю место и трачу время.

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

Другие вопросы по тегам