http://www.cnblogs.com/chenxizhang/archive/2011/09/10/2172994.html看看这个吧.. 超级不错的..while(true)这东西不是很好.相对异步来说...所以你这代码只能自己玩玩...
解决方案 »
- 如何将B/S程序和C/S程序一起打包安装???
- 传窗体句柄的问题
- sql数据插入如何屏蔽掉重复数据
- 右击datagridview如何判断是否点到某单元格并获取其位置显示右键菜单
- c#问题
- VS2005中我把控件定义成静态的,每次修改一些数据口,它都会自动变回非静态的,如何解决?
- 如何利用javascript取得ip,很急
- ???怎么用计算一个公式值,比如string var = "1+1",我怎么得到结果2?
- VSTO中在PPT2007中插入图表如何不打开Excel
- 求教Timer用法
- vs或者resharper有没有快捷方法处理""改成string.empty
- 能不能通过Linq的ForEach方法更新集合中的数据?
在后面添加一个sleep吧 这样就不会死机了
正常会在click的方法里面新开一个线程,在新的线程里面去while(true)监听
{
while (true)
{
int receiveLength = Rcconnect.client.Receive(result);
listBox1.Items.Add(DateTime.Now + " RecConext>" + Encoding.GetEncoding("GB2312").GetString(result, 0, receiveLength));
}
}));
而你用控制台,在第一次Receive的时候面临的是控制台的退出,因为程序没执行完成(即线程没退出),所以你此时卡住的是控制台的退出,并未将循环执行下去,因此让你错误的以为控制台是可以执行的。
为什么用控制台的时候,往往都要加一句Console.ReadKey(); 就是为了阻止线程的结束,你这里的死循环起到了这个效果而已
方案2 查看异步SOCKET 。
Task.Factory.StartNew(new Action(() =>
{
while (true)
{
int receiveLength = Rcconnect.client.Receive(result);
listBox1.Invoke((Action)(() =>
{
listBox1.Items.Add(DateTime.Now + " RecConext>" + Encoding.GetEncoding("GB2312").GetString(result, 0, receiveLength));
}));
}
}));
Task.Factory.StartNew(new Action(() =>
{
while (true)
{
int receiveLength = Rcconnect.client.Receive(result);
listBox1.Invoke((Action)(() =>
{
listBox1.Items.Add(DateTime.Now + " RecConext>" + Encoding.GetEncoding("GB2312").GetString(result, 0, receiveLength));
}));
}
}));
恩,失误,写漏了,没注意到有控件对象
要么不用,要么放到线程里去用,永远不要在主线程里while(true)
while (true) 这个东西岂能是主线程使用的!!!这不是控制台啊亲!!
你用控制台程序,也是逻辑在执行,但是不会再响应输入了