使用按钮 开个线程,此线程使用一个socket连接,等待socket server下发的信息,并更新界面listview socket线程委托 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 client.BeginReceive(so.buffer, 0, StateObject.BUFFER_SIZE, 0, new AsyncCallback(Async_Send_Receive.Read_Callback), so); 要么在Receive的时候改为异步,要么就在richTxt.Invoke(objproxy, new object[] { suffixobj });的时候改为异步委托,总之这两个地方都会阻塞线程。 socket连接和接收数据都用异步比较好,如果发送信息比较频繁,坚持设置成长连接。给你个网址吧,很全,可以参考下。http://blog.csdn.net/ts_coo/article/category/1188088 异步编程模型(APM) 涉及到Socket通信、串口通信等等等详细参考 http://www.cnblogs.com/xiaozhi_5638/p/3167794.html 一句话 解决 Task.Factory.StartNew(() => 你的函数名称());你的函数名称 可以处理等待 更新Lable 等 不会阻塞主线程的.4.0下可以这么用楼上什么同步异步的方案 2.0下用用差不多,4.0在用这个太复杂,太落伍了MS 就是知道自己的同步异步太麻烦了,才封装了一次,出现TPL方式具体 可以百度 C# TPL 窗体://监听消息StartUdpThread startUdpThread = new StartUdpThread(列表控件...等参数);//自定义的类System.Threading.Thread startThread = new System.Threading.Thread(new System.Threading.ThreadStart(startUdpThread.StartUdp));//StartUdp未自定义监听方法startThread.IsBackground = true;startThread.Start();StartUdpThread 类:class StartUdpThread{ private ListView list; ... public StartUdpThread(ListView list,...) { this.list = list; } public void StartUdp() { System.Net.Sockets.UdpClient udpCLient = new System.Net.Sockets.UdpClient(2425); System.Net.IPEndPoint ipEndPoint = new System.Net.IPEndPoint(System.Net.IPAddress.Any,0); while (true) { //读取并处理消息 } }} 试了Task ,也是阻塞主界面。可能我没写对。然后又使用BeginReceive,接收到数据了,有长度返回,但是我解析不出来。C#我是零零碎碎学的,系统不起来。 弄出来了,while (true) { if (richTxt.InvokeRequired) { delegateWaitMessage objproxy = waitForMessage; richTxt.Invoke(objproxy, new object[] { suffixobj }); } }有个例子上if 后面有个else,我不明白什么意思就把else后面的给去了,后来在一个类似的功能里看到有else能成功,就把自己的加了else结果对了。不过还是没明白为什么这么实现,。也不用异步接收,异步连接等。 private void button1_Click(object sender, EventArgs e) { ParameterizedThreadStart pstart = new ParameterizedThreadStart(recMessage); Thread mythread = new Thread(pstart); string suffixobj = myCarSuffix.ToString(); mythread.IsBackground = true; mythread.Start(suffixobj); } catch (Exception ee) { richtxt.AppendText("网络连接异常\n"); } } private delegate void delegateWaitMessage(object tmp); private void showMsgInTxt(object stateobjin) { Simobject stateobj = (Simobject)stateobjin; string suffix = stateobj.suffix.ToString(); RichTextBox richTxt; if (!suffix.Equals("0")) { richTxt = (RichTextBox)(tabControl1.Controls.Find("richTextBox1" + suffix, true)[0]); stateobj = clientmap["cars1" + suffix]; } else { richTxt = richTextBox1; stateobj = clientmap["cars1"]; } if (richTxt.InvokeRequired) { delegateWaitMessage objproxy = showMsgInTxt; richTxt.BeginInvoke(objproxy, new object[] { stateobj }); } else { richTxt.AppendText(stateobj.result+"\n"); richTxt.Update(); } } private void recMessage(object suffixobj) { string suffix = suffixobj.ToString(); RichTextBox richTxt; Socket client; Simobject state; if (!suffix.Equals("0")) { richTxt = (RichTextBox)(tabControl1.Controls.Find("richTextBox1" + suffix, true)[0]); client = ((Simobject)clientmap["cars1" + suffix]).workSocket; state = clientmap["cars1" + suffix]; } else { richTxt = richTextBox1; client = ((Simobject)clientmap["cars1"]).workSocket; state = clientmap["cars1"]; } while (true) { int bytesRead = client.Receive(state.buffer); if (bytesRead > 0) { string stringdata = Utils.byteToHexStr(state.buffer, bytesRead); state.result = ParseResponse.ParseData(stringdata); showMsgInTxt(state); } } } class Simobject { public Socket workSocket = null; public static int BUFFER_SIZE = 256; public byte[] buffer = new byte[BUFFER_SIZE]; public StringBuilder sb = new StringBuilder(); public string result=""; public object suffix; } 用java怎么写,我也向实现这个功能。初学java 怎样关闭和释放System.Timers.Timer? 大家进来探讨如何设计这个需求.. 关于C#中申请空间的函数问题 WinForm动态添加到Panel里面的控件不知道怎样定位 我从网上找了一段翻转图代码,是js的,怎么进行数据绑定啊,c# Environment.CurrentDirectory 两种结果 c#写的程序为什么占用这么大的内存? 关于"Ajax实现自动完成(字典)功能"有谁调试通过吗 多线程图像处理,出现位图已被锁定异常 将一个有序数组进行排列 关于类的设计问题 Excel数据导入到SQL Server数据库(C#)
new AsyncCallback(Async_Send_Receive.Read_Callback), so);
的时候改为异步委托,总之这两个地方都会阻塞线程。
http://blog.csdn.net/ts_coo/article/category/1188088
详细参考 http://www.cnblogs.com/xiaozhi_5638/p/3167794.html
4.0下可以这么用
楼上什么同步异步的方案 2.0下用用差不多,4.0在用这个太复杂,太落伍了
MS 就是知道自己的同步异步太麻烦了,才封装了一次,出现TPL方式
具体 可以百度 C# TPL
//监听消息
StartUdpThread startUdpThread = new StartUdpThread(列表控件...等参数);//自定义的类
System.Threading.Thread startThread = new System.Threading.Thread(new System.Threading.ThreadStart(startUdpThread.StartUdp));//StartUdp未自定义监听方法
startThread.IsBackground = true;
startThread.Start();
StartUdpThread 类:
class StartUdpThread
{
private ListView list;
...
public StartUdpThread(ListView list,...)
{
this.list = list;
}
public void StartUdp()
{
System.Net.Sockets.UdpClient udpCLient = new System.Net.Sockets.UdpClient(2425);
System.Net.IPEndPoint ipEndPoint = new System.Net.IPEndPoint(System.Net.IPAddress.Any,0);
while (true)
{
//读取并处理消息
}
}
}
试了Task ,也是阻塞主界面。可能我没写对。然后又使用BeginReceive,接收到数据了,有长度返回,
但是我解析不出来。C#我是零零碎碎学的,系统不起来。
{
if (richTxt.InvokeRequired)
{
delegateWaitMessage objproxy = waitForMessage;
richTxt.Invoke(objproxy, new object[] { suffixobj });
}
}
有个例子上if 后面有个else,我不明白什么意思就把else后面的给去了,后来在一个类似的功能里看到有else
能成功,就把自己的加了else结果对了。不过还是没明白为什么这么实现,。也不用异步接收,异步连接等。 private void button1_Click(object sender, EventArgs e)
{
ParameterizedThreadStart pstart = new ParameterizedThreadStart(recMessage);
Thread mythread = new Thread(pstart);
string suffixobj = myCarSuffix.ToString();
mythread.IsBackground = true;
mythread.Start(suffixobj);
}
catch (Exception ee)
{
richtxt.AppendText("网络连接异常\n");
}
}
private delegate void delegateWaitMessage(object tmp); private void showMsgInTxt(object stateobjin)
{ Simobject stateobj = (Simobject)stateobjin;
string suffix = stateobj.suffix.ToString();
RichTextBox richTxt;
if (!suffix.Equals("0"))
{
richTxt = (RichTextBox)(tabControl1.Controls.Find("richTextBox1" + suffix, true)[0]);
stateobj = clientmap["cars1" + suffix];
}
else
{
richTxt = richTextBox1;
stateobj = clientmap["cars1"];
} if (richTxt.InvokeRequired)
{
delegateWaitMessage objproxy = showMsgInTxt;
richTxt.BeginInvoke(objproxy, new object[] { stateobj });
}
else
{
richTxt.AppendText(stateobj.result+"\n");
richTxt.Update();
} } private void recMessage(object suffixobj)
{
string suffix = suffixobj.ToString();
RichTextBox richTxt;
Socket client;
Simobject state;
if (!suffix.Equals("0"))
{
richTxt = (RichTextBox)(tabControl1.Controls.Find("richTextBox1" + suffix, true)[0]);
client = ((Simobject)clientmap["cars1" + suffix]).workSocket;
state = clientmap["cars1" + suffix];
}
else
{
richTxt = richTextBox1;
client = ((Simobject)clientmap["cars1"]).workSocket;
state = clientmap["cars1"];
}
while (true)
{
int bytesRead = client.Receive(state.buffer);
if (bytesRead > 0)
{
string stringdata = Utils.byteToHexStr(state.buffer, bytesRead);
state.result = ParseResponse.ParseData(stringdata);
showMsgInTxt(state);
}
}
} class Simobject
{
public Socket workSocket = null;
public static int BUFFER_SIZE = 256;
public byte[] buffer = new byte[BUFFER_SIZE];
public StringBuilder sb = new StringBuilder();
public string result="";
public object suffix;
}