C#定时器和线程的问题
Thread logtemp;
private void timer2_Tick(object sender, EventArgs e)
{
logtemp = new Thread(new ThreadStart(ReadLogTempFun));
logtemp.IsBackground = true;
logtemp.Start();
}
private void ReadLogTempFun()
{
//要执行的代码
}
我一步一步跟踪得到的结果,程序运行 ,执行定时器后,跑到ReadLogTempFun()执行,这个时候函数没执行完,仅仅是执行一小部分,又回到了定时器代码部分来执行,我把定时的时间改到很大,还是那样。如果不调试跟踪,从结果上来看是看把函数里面的代码区别执行完。这是怎么回事。希望知道的朋友说一下。谢谢了。
------解决方案--------------------timer2间隔多少呢,很大是多少,是不是在又一个线程过来了?
------解决方案--------------------1000毫秒=1秒
------解决方案--------------------你每次间隔不是logtemp = new Thread(new ThreadStart(ReadLogTempFun)); ?
------解决方案--------------------楼主,这个情况我的理解是这样的:
(1)Thread.Start()方法运行后,ReadLogTempFun方法就进入了另外一个线程,而定时器是主线程中运行的,所以没等ReadLogTempFun运行完,定时器又开始运行了。
(2)不知道你的定时器是否用Timer的,Timer线程也是一个辅助线程,所以同样不在主线程中运行
(3)如果,你想把Thread中的代码运行完之后的话,思路是,将定时器的代码改到主线程中,然后,用Thread.Join()方法让ReadLogTempFun的方法完成后,才进行。
希望对你有帮助。
------解决方案--------------------你把timer2的间隔设置成2分钟就可以看到你想要的结果了。
你timer中的开启线程,代码已经执行完成了,所开启的线程跟timer没任何关系,这个时候你timer设置的时间到了,自然就进入到timer的代码里去了。
调试你用了10秒,而timer设置的是3秒,明显超过了timer的时间。
如果不调试跟踪,从结果上来看是看把函数里面的代码区别执行完。这是因为执行线程的时间很短,小于timer的间隔时间。如果线程里的代码很复杂,执行时间要很长,那就跟你现在调试一样的结果了。
最好不要在timer或是线程中套线程。
------解决方案--------------------因为你在logtemp = new Thread(new ThreadStart(ReadLogTempFun)); 是这样定义的。
所以每执行到这里来的时候就会调用那个方法。
------解决方案--------------------一看这蛋疼的代码就知道业务逻辑及其混乱。创建了无数线程。不乱才怪。
------解决方案--------------------调试的时间比较长!超过timer的长度了
------解决方案--------------------mark~~
------解决方案--------------------LZ,你既然用了定时器,为什么还要用线程!
定时器:除了System.Windows.Forms.Timer是单线程外,System.Threading.Timer和 System.Timers.Timer都是多线程的。
你在定时器里又用到线程,那么不管时间到与没到,只要CPU的时间片一到,就会无条件跑到新的线程中。这是你控制不了的。
既然你只想由定时器控制执行,那么就不要用新的线程,把功能放到定时器处理函数中。
------解决方案--------------------Timer里不要用线程,尝试使用System.Threading.Timer和 System.Timers.Timer吧。