唉!我回来了,伙计们!我讨厌用我的问题打扰别人,但我已经为此工作了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元素的线程安全调用,但代码太混乱无法理解,当我最终以为我实现了一个解决方案,它只是拒绝工作..)
尽管它是一个错误的异常,但它看起来像你从其他线程访问'RichTextBox'。尝试在调用'box.AppendText()'时使用'Invoke'。 – Sinatr
这可能不是'线路'的问题吗?如果它是空的和/或空的呢?尝试检查'if(string.IsNullOrEmpty(line))){return; }'。只要确保线路没有问题。 – Iqbal
@Sinatr:我将如何使用Invoke方法?我试图做的是MSDN示例在AppendText方法中显示给我的内容,即使它被编译了,它在执行时也没有任何反应。我删除了该代码,但我可以尝试再次执行此操作。或者,也许我应该在GotMessage的swich语句中尝试它? @ Iqbal:该行不会出现空白。 debug.print方法只是为我输入System.Console.Write的一种较短的方法。每次收到数据包时,控制台都能够打印字符串,所以我知道它不是空的。 – Silver