【发布时间】:2013-03-02 21:16:18
【问题描述】:
常规
我正在尝试用 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
}
【问题讨论】:
-
我已经做出了回答,已经受到 Microsoft 回答的影响,但最大的问题仍然存在:这是从后台线程运行的。这是一个非常重要的问题,它将彻底改变我的答案。
-
我认为您应该使用 MSDN reference to the StackOverflow answer seriously。 Invoke 是一个单行修复程序,而不是一个项目本身。您还应该能够判断您是否看到了跨线程问题。是否存在内部异常?
标签: c# asynchronous tcp client