(我的编程水平是基础。)
我正在开发一个程序:一个客户端,该客户端通过TCP套接字访问服务器(服务器是带有TCP的工业gm调制解调器),该服务器始终在固定端口上进行侦听。
我希望我的C#Windows窗体应用程序不冻结。
我读到最好的方法是异步套接字。在异步套接字上的famous MSDN示例中,将ManualResetEvent
与WaitOne()
一起使用。但是,如果我尝试连接到服务器但服务器处于脱机状态,或者服务器在我的请求后未发送任何数据,则这种类型的代码会挂起UI
有人建议根据timer使用this来进行超时:如果自从连接,发送,接收...的呼叫以来经过了足够的时间,则关闭套接字。
数据到来后我无法更新表单
在该代码中,我添加了以下内容:
public Form1()
{
InitializeComponent();
tbIP.Text = "127.1.1.1";
}
AsyncClass asyncClass=new AsyncClass();
byte[] data;
private void button1_Click(object sender, EventArgs e)
{
data = Encoding.ASCII.GetBytes("Hello");
if (asyncClass.sock.Connected==false)
{
asyncClass.sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
asyncClass.sock.Connect(IPAddress.Parse(tbIP.Text), 502);
}
if (asyncClass.sock.Connected)
{
asyncClass.sock.Send(data);
asyncClass.StartReceive();
rtbStatusMessages.AppendText(asyncClass.messages);
string sData = Encoding.ASCII.GetString(asyncClass.buffer);
tbReceivedData.AppendText(sData);
}
}
我知道我做错了。 我觉得应该以某种方式在线程中完成使用接收到的数据更新表单的操作……但是我不知道该怎么做。