概述
我正试图用C#编写一个非常简单的TCP/IP客户端服务器,连接到一个IP地址并指定一个端口号,请求一些简单的行命令,然后将回复放置在网格框、图形或其他显示选项中。
我在网上找到了一个可以下载的实用程序,由Jayan Nair编写,它似乎可以正确地发送消息并接收回复。
问题出在当我尝试将回复数据加载到richtext或GridView时。
我得到的错误信息是:System.InvalidOperationException
我已经在Microsoft论坛上求助过,他们给了我一个非常复杂、模糊和过度涉及INVOKE和BeginInvoke的解决方法,整个过程似乎成为一个项目。
我想要的只是一个能够工作的示例,不要太复杂。
这是代码:
try
{
SocketPacket theSockId = (SocketPacket)asyn.AsyncState;
int iRx = theSockId.thisSocket.EndReceive(asyn);
char[] chars = new char[iRx + 1];
System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder();
int charLen = d.GetChars(theSockId.dataBuffer, 0, iRx, chars, 0);
//
System.String szData = new System.String(chars);
richTextRxMessage.Text = szData; // fails
//textBox1.Text = szData; // also fails
WaitForData();
}
以下是错误信息:
base {System.Windows.Forms.TextBoxBase} = {Text = '((System.Windows.Forms.RichTextBox) (((System.Windows.Forms.RichTextBox)(richTextRxMessage)))).Text' threw an exception of type 'System.InvalidOperationException'}
附加信息如下: szData包含大约6300个字符,包括制表符(9)和回车(13),与从服务器发送的消息一致。 我还尝试过使用文本框而不是RichText,结果相同。
对于那些感兴趣的人
这是Microsoft的链接
public void OnDataReceived(IAsyncResult asyn)
{
int InputRx;
int charLen;
char[] Inputchars;
System.Text.Decoder InputDecode;
System.String szData;
bool IfInvokeRequired;
try
{
SocketPacket theSockId = (SocketPacket)asyn.AsyncState;
InputRx = theSockId.thisSocket.EndReceive(asyn); // get size of input array
Inputchars = new char[InputRx + 1]; // put i char array
InputDecode = System.Text.Encoding.UTF8.GetDecoder();
charLen = InputDecode.GetChars(theSockId.dataBuffer, 0, InputRx, Inputchars, 0);
szData = new System.String(Inputchars);
IfInvokeRequired = richTextRxMessage.InvokeRequired;
if (IfInvokeRequired == true)
{
richTextRxMessage.Invoke((MethodInvoker)delegate { this.Text = szData; });// fails
richTextRxMessage.BeginInvoke(new MethodInvoker(() => richTextRxMessage.Text = szData));//fails as well
}