2014-02-06 87 views
0

唉!我回来了,伙计们!我讨厌用我的问题打扰别人,但我已经为此工作了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)。我注意到了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元素的线程安全调用,但代码太混乱无法理解,当我最终以为我实现了一个解决方案,它只是拒绝工作..)

+0

尽管它是一个错误的异常,但它看起来像你从其他线程访问'RichTextBox'。尝试在调用'box.AppendText()'时使用'Invoke'。 – Sinatr

+0

这可能不是'线路'的问题吗?如果它是空的和/或空的呢?尝试检查'if(string.IsNullOrEmpty(line))){return; }'。只要确保线路没有问题。 – Iqbal

+0

@Sinatr:我将如何使用Invoke方法?我试图做的是MSDN示例在AppendText方法中显示给我的内容,即使它被编译了,它在执行时也没有任何反应。我删除了该代码,但我可以尝试再次执行此操作。或者,也许我应该在GotMessage的swich语句中尝试它? @ Iqbal:该行不会出现空白。 debug.print方法只是为我输入System.Console.Write的一种较短的方法。每次收到数据包时,控制台都能够打印字符串,所以我知道它不是空的。 – Silver

回答

0

Pfft,看看我,弄清楚事情。

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

我coooould添加代码,以显示我做了什么。如果有人需要这种问题的帮助,我会。我认为我有能力解释它,但MSDN创造奇迹。

与往常一样,我只是提出问题,并阅读意见,以正确的方向领导。

我真的需要停止提问,我最终回答日后。 :/

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

编辑:我也写了一个非常巧妙的方法来规避需要使用代表。但是,它需要使用计时器,或者也可以重新绘制窗体的循环(我使用了一个计时器)。