一般的
我正在尝试用 C# 编写一个非常简单的 TCPIP 客户端服务器来连接到一个 IP 地址,一个端口号,并询问非常简单的行命令,然后将回复放在 Gridbox、图形或其他显示选项中。
我在网上查看并找到了一个可下载的实用程序,它由 Jayan Nair 编写,它似乎可以正确发送消息,并且可以收到回复。
当我尝试将回复数据加载到富文本或 GridView 中时,问题就出现了。
我收到的错误消息是:- System.InvalidOperationException
我问过微软论坛,他们给了我一个非常复杂、模棱两可和过度参与的指示,告诉我应该做什么,这涉及到一个叫做 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),并且与从服务器发送的消息一致我也尝试过使用文本框而不是富文本,结果相同
对于那些有兴趣的人
这是微软的链接
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
}