0

啊!我回来了,伙计们!我讨厌不得不用我的问题打扰别人,但我已经为此工作了 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 的调用。

当错误第一次弹出时,我试图在 Lidgren Google Group 上发帖,但我没有得到他们的回复,所以我希望这里的人们能够获得我所寻求的信息。:)

如果需要,我可以提供更多信息和代码(一如既往,呵呵)。

(我用谷歌搜索了如何对 UI 元素进行线程安全调用,但代码太混乱了,无法理解。当我最终认为我实现了一个解决方案时,它根本就拒绝工作......)

4

1 回答 1

0

噗,看着我,把事情弄清楚。

我能够成功地将委托方法添加到我的表单中,以便可以跨线程访问它们。或者我被引导去相信。代码现在按预期运行。

我很想添加代码,以显示我所做的。如果有人需要帮助解决这类问题,我会的。我想我有能力解释它,但MSDN 创造了奇迹。

与往常一样,我只需要提出问题,阅读评论,就可以朝着正确的方向前进。

我真的需要停止问我几天后才回答的问题。:/

我很抱歉。我觉得占用空间和浪费时间真的很糟糕。

编辑:我还编写了一种非常聪明的方法来规避需要使用委托。但是,它需要使用计时器,或者不时重绘窗口窗体的循环(我使用了计时器)。

于 2014-02-07T07:22:37.870 回答