2014-02-06 47 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創造奇蹟。

與往常一樣,我只是提出問題,並閱讀意見,以正確的方向領導。

我真的需要停止提問,我最終回答日後。 :/

我很抱歉。我覺得佔用空間和浪費時間非常糟糕。

編輯:我也寫了一個非常巧妙的方法來規避需要使用代表。但是,它需要使用計時器,或者也可以重新繪製窗體的循環(我使用了一個計時器)。