请教下System.Windows.Forms.Timer与多线程问题 private void timer1_Tick(object sender, Even

时间:2021-11-09 20:37:48
 private void timer1_Tick(object sender, EventArgs e)
        {
           
           newThread = new Thread(DoWork);
            newThread.Start();

            int y = 1;  //这里为何只执行一次   
           
        }


        private void DoWork()
        {
            timer1.Stop();

            //dosomething long
          
           timer1.Start();

          
        }
问题是为何int y=1;只执行一次,timer1.Start();明明有执行的~ 谢谢!

17 个解决方案

#1


Timer在Stop之后再Start,从头开始计时,所以这个DoWork执行得快的话,Tick根本来不及发生。

#2


int y = 1;  //这里为何只执行一次  
          具体的时间设置,如果tick 为1min 执行了两分钟,那么,tick没作用了吧

#3


引用 2 楼 zhangyanyang 的回复:
int y = 1;  //这里为何只执行一次 
          具体的时间设置,如果tick 为1min 执行了两分钟,那么,tick没作用了吧

我时间每5秒触发一次,与每500ms触发一次都试过,都不可以.

#4


引用 1 楼 dancingbit 的回复:
Timer在Stop之后再Start,从头开始计时,所以这个DoWork执行得快的话,Tick根本来不及发生。

不太明白~~
timer从头开始计时的话,会影响当前线程吗?或者说DoWork() 执行完后,无论如何会返回去吧?
一时想不通,不要见笑。谢谢!

#5


1.这两个方法在不同的线程中执行。
2.第二个线程启动后,立刻执行Timer的Stop,由于Tick事件需要计时器处于启用状态,由此可推断,计时器状态的改变导致这个方法被提前终止。
3.第二个线程随后在其结束前又开启了计时器,导致Tick事件发生,然后线程启动,又转到前一种状态。
4.线程对象创建以后,由系统独立地进行调度,线程方法也不同于普通方法,线程结束以后,控制权转移到系统。

这些是基于我对线程的认识所做的分析,不一定准确。
另外,这个结果应该还会受到线程调度的影响,如果在Tick事件处理方法中创建的线程没有立刻被调度,也不会出现这种情况。

#6


请教:dancingbit

我觉得我可能中间某个环节认识有误,我把自认为的执线路线说一下,您帮我看看哪个地方理解错了?谢谢!

我把timer的InterVal设为10秒一次,那么程序开始执行后,
1.将会等待10秒,开始一个线程进行DoWork();
2.这时DoWork(),执行timer1.Stop(); timer于是关闭了,新的任务(第2个线程)无法启动了,可是本线程DoWork还是会继续进行下去的吧
3. 本线程继续执行DoWork中的任务,假设2秒钟 
5. 本线程执行到timer1.Start(); 这时重新开启计时器
6. 由于重新的计时,10秒钟后又开了一个新的任务

#7


2.这时DoWork(),执行timer1.Stop(); timer于是关闭了, 新的任务(第2个线程)无法启动了,可是本线程DoWork还是会继续进行下去的吧                          
------------------------------------
红字的那一句,指的是什么?

不过我现在还有些疑惑,你怎么确定的“ int y = 1;  //这里为何只执行一次  ”?

#8


TO: dancingbit

红字的那一句就是 
newThread = new Thread(DoWork);  newThread.Start(); 
即如果没有timer.stop()这一句,每10秒就会执行到红字的那一句就是

-----------------------------------------
你怎么确定的“ int y = 1;  //这里为何只执行一次  ”? 
我用断点看的,因为主要是DoWork()执行一次就没执行了,我想确实是否只执行了一次。所以加了int y = 1; 当试验的,

#9


你的意思是:你发现DoWork只执行了一次?

#10


貌似断点对线程是不起作用的,楼主还是要用其他的方法来验证是否真的只执行了一次

#11


TO:dancingbit
你的意思是:你发现DoWork只执行了一次?
---------------------------------
是的,如果不用Thread,直接用单线程调用DoWork()就正常。

TO:superzxf
貌似断点对线程是不起作用的,楼主还是要用其他的方法来验证是否真的只执行了一次 
----------------------------------------
我用写文本的方式验证过了

#12


我就是无法理解,当用多Thread时,我已经把timer的触发时间设置得很大了,理论上应该可以同步呀~~

#13


自己顶一下

#14


多线程中System.Windows.Forms.Timer是无效的,根本就不会执行,System.Windows.Forms.Timer这个定时器需要用户消息泵才可以运行,如果要在多线程中使用定时器,就使用System.Threading.Timer或者System.Timer.Timer

#15


引用 14 楼 ttianqq 的回复:
多线程中System.Windows.Forms.Timer是无效的,根本就不会执行,System.Windows.Forms.Timer这个定时器需要用户消息泵才可以运行,如果要在多线程中使用定时器,就使用System.Threading.Timer或者System.Timer.Timer


可是以上的DoWork()执行了一次~~
而且如果去掉timer1.Stop(); 和timer1.start();也能不断执行。
所以并不是效的。

#16


有谁知道吗? 谢谢!

#17


再顶一天

#1


Timer在Stop之后再Start,从头开始计时,所以这个DoWork执行得快的话,Tick根本来不及发生。

#2


int y = 1;  //这里为何只执行一次  
          具体的时间设置,如果tick 为1min 执行了两分钟,那么,tick没作用了吧

#3


引用 2 楼 zhangyanyang 的回复:
int y = 1;  //这里为何只执行一次 
          具体的时间设置,如果tick 为1min 执行了两分钟,那么,tick没作用了吧

我时间每5秒触发一次,与每500ms触发一次都试过,都不可以.

#4


引用 1 楼 dancingbit 的回复:
Timer在Stop之后再Start,从头开始计时,所以这个DoWork执行得快的话,Tick根本来不及发生。

不太明白~~
timer从头开始计时的话,会影响当前线程吗?或者说DoWork() 执行完后,无论如何会返回去吧?
一时想不通,不要见笑。谢谢!

#5


1.这两个方法在不同的线程中执行。
2.第二个线程启动后,立刻执行Timer的Stop,由于Tick事件需要计时器处于启用状态,由此可推断,计时器状态的改变导致这个方法被提前终止。
3.第二个线程随后在其结束前又开启了计时器,导致Tick事件发生,然后线程启动,又转到前一种状态。
4.线程对象创建以后,由系统独立地进行调度,线程方法也不同于普通方法,线程结束以后,控制权转移到系统。

这些是基于我对线程的认识所做的分析,不一定准确。
另外,这个结果应该还会受到线程调度的影响,如果在Tick事件处理方法中创建的线程没有立刻被调度,也不会出现这种情况。

#6


请教:dancingbit

我觉得我可能中间某个环节认识有误,我把自认为的执线路线说一下,您帮我看看哪个地方理解错了?谢谢!

我把timer的InterVal设为10秒一次,那么程序开始执行后,
1.将会等待10秒,开始一个线程进行DoWork();
2.这时DoWork(),执行timer1.Stop(); timer于是关闭了,新的任务(第2个线程)无法启动了,可是本线程DoWork还是会继续进行下去的吧
3. 本线程继续执行DoWork中的任务,假设2秒钟 
5. 本线程执行到timer1.Start(); 这时重新开启计时器
6. 由于重新的计时,10秒钟后又开了一个新的任务

#7


2.这时DoWork(),执行timer1.Stop(); timer于是关闭了, 新的任务(第2个线程)无法启动了,可是本线程DoWork还是会继续进行下去的吧                          
------------------------------------
红字的那一句,指的是什么?

不过我现在还有些疑惑,你怎么确定的“ int y = 1;  //这里为何只执行一次  ”?

#8


TO: dancingbit

红字的那一句就是 
newThread = new Thread(DoWork);  newThread.Start(); 
即如果没有timer.stop()这一句,每10秒就会执行到红字的那一句就是

-----------------------------------------
你怎么确定的“ int y = 1;  //这里为何只执行一次  ”? 
我用断点看的,因为主要是DoWork()执行一次就没执行了,我想确实是否只执行了一次。所以加了int y = 1; 当试验的,

#9


你的意思是:你发现DoWork只执行了一次?

#10


貌似断点对线程是不起作用的,楼主还是要用其他的方法来验证是否真的只执行了一次

#11


TO:dancingbit
你的意思是:你发现DoWork只执行了一次?
---------------------------------
是的,如果不用Thread,直接用单线程调用DoWork()就正常。

TO:superzxf
貌似断点对线程是不起作用的,楼主还是要用其他的方法来验证是否真的只执行了一次 
----------------------------------------
我用写文本的方式验证过了

#12


我就是无法理解,当用多Thread时,我已经把timer的触发时间设置得很大了,理论上应该可以同步呀~~

#13


自己顶一下

#14


多线程中System.Windows.Forms.Timer是无效的,根本就不会执行,System.Windows.Forms.Timer这个定时器需要用户消息泵才可以运行,如果要在多线程中使用定时器,就使用System.Threading.Timer或者System.Timer.Timer

#15


引用 14 楼 ttianqq 的回复:
多线程中System.Windows.Forms.Timer是无效的,根本就不会执行,System.Windows.Forms.Timer这个定时器需要用户消息泵才可以运行,如果要在多线程中使用定时器,就使用System.Threading.Timer或者System.Timer.Timer


可是以上的DoWork()执行了一次~~
而且如果去掉timer1.Stop(); 和timer1.start();也能不断执行。
所以并不是效的。

#16


有谁知道吗? 谢谢!

#17


再顶一天