日期:2014-05-18  浏览次数:20928 次

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吧。