哎呀!伙计们,我回来了!我不愿意为我的问题打扰别人,但我已经为此工作了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元素进行线程安全调用,但代码实在太难以理解。当我最终认为我实现了一个解决方案时,它根本就拒绝工作..)
答案 0 :(得分:0)
Pfft,看着我,弄清楚事情。
我能够成功地将委托方法添加到表单中,以便可以跨线程访问它们。或者让我相信。代码现在按预期运行。
我可以添加代码,以显示我的所作所为。如果有人需要这类问题的帮助,我会的。我想我有能力解释它,但MSDN可以创造奇迹。
与往常一样,我只需要提出问题,并阅读评论,以便朝着正确的方向发展。
我真的需要停止提问我几天后回答的问题。 :/
我很抱歉。我觉得占用空间和浪费时间真的很糟糕。
编辑:我还写了一个非常聪明的方法来规避需要使用委托。但是,它需要使用一个计时器,或者一个不时重新绘制窗体的循环(我使用了计时器)。