情况是这样的,这是代码 port.DataReceived += comm_DataReceived;//注册接受串口数据的事件,意思是只要串口有数据来,就触发响应函数 }
void comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
MethodInvoker dataremi = new MethodInvoker(updatemainlable);//异步形式,为了能访问父进程的控件
IAsyncResult iar=BeginInvoke(dataremi);//开始
Thread.sleep(1000); //没这句话,UI界面停止更新。疑问之处。
if (iar.IsCompleted)//判断串口数据接受的线程有没有执行好,好了就做下面的
{
outoffcontrol();//看看采集来的数值是否超标
savedata();//将采集来的数据存入数据库
}
}功能实现的非常好!没有问题。但是当我想要看看整个程序的性能时。问题就来了。这程序在不断的创建新的线程,几分钟就能创建700多个线程。
经过排查,发现只要在 comm_DataReceived 函数里出现Thread.sleep(1000); ,那么就会出现不停创建新线程的情况。
但是没有Thread.sleep(1000); 这条语句的话,程序就一直循环在updatemainlable函数的开头到Application.DoEvents();这条语句。造成该线程无法进行下去,界面的数据无法更新。所以想问问大神们,这是为什么?为什么在这样的函数里面不能有Thread.sleep这句话?
void comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
MethodInvoker dataremi = new MethodInvoker(updatemainlable);//异步形式,为了能访问父进程的控件
IAsyncResult iar=BeginInvoke(dataremi);//开始
Thread.sleep(1000); //没这句话,UI界面停止更新。疑问之处。
if (iar.IsCompleted)//判断串口数据接受的线程有没有执行好,好了就做下面的
{
outoffcontrol();//看看采集来的数值是否超标
savedata();//将采集来的数据存入数据库
}
}功能实现的非常好!没有问题。但是当我想要看看整个程序的性能时。问题就来了。这程序在不断的创建新的线程,几分钟就能创建700多个线程。
经过排查,发现只要在 comm_DataReceived 函数里出现Thread.sleep(1000); ,那么就会出现不停创建新线程的情况。
但是没有Thread.sleep(1000); 这条语句的话,程序就一直循环在updatemainlable函数的开头到Application.DoEvents();这条语句。造成该线程无法进行下去,界面的数据无法更新。所以想问问大神们,这是为什么?为什么在这样的函数里面不能有Thread.sleep这句话?
解决方案 »
- datagridview 绑定强类型dataset,删除问题
- 急!“解决方案文件...已在环境外部被修改”
- |M| 500分 求一个对两个表的水晶报表的设计方法:单一个表我会做两个表就没有办法了 ;明天就要交差了啊。。帮我看一下啊
- Reflection的疑惑,请C#的高手指教,我是用Java的,感觉C#在这点上没Java好用
- 两个很小的问题!
- 为什么查找不到path的类型。。求救求救!!!!
- -------------------->>关于C#,如何自动取ListBox中的所有值,高手请进------------------------------------------
- 怎样在ASP.NET中在按在按钮时打开一个没有菜单栏和工具栏的新页面?
- 求高手解决下C/S环境下txt比较相同数据问题,谢谢了!
- 请问高手,VS.NET 平台问题,急
- 怎样将datagridview中某一列的值由int型改为string型在网上看了方法但试了试不不起作用,这一列还会通过程序添加字符串
- 水晶报表分页小计问题
“但是没有Thread.sleep(1000); 这条语句的话,程序就一直循环在updatemainlable函数的开头到Application.DoEvents();这条语句。造成该线程无法进行下去,界面的数据无法更新。”
别用sleep这种方式,给BeginInvoke方法中传递 callBack
这里问题的关键不是Thread.Sleep,它只是让阻塞之后的程序变得性能更差、逻辑更糟。导火索还是if(iar.IsCompleted)这类语句的问题。
我有个程序用了backgroundworker 读取几M 或几百M的txt文件 就会卡死 纠结啊