{
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没作用了吧
具体的时间设置,如果tick 为1min 执行了两分钟,那么,tick没作用了吧
#3
我时间每5秒触发一次,与每500ms触发一次都试过,都不可以.
#4
不太明白~~
timer从头开始计时的话,会影响当前线程吗?或者说DoWork() 执行完后,无论如何会返回去吧?
一时想不通,不要见笑。谢谢!
#5
1.这两个方法在不同的线程中执行。
2.第二个线程启动后,立刻执行Timer的Stop,由于Tick事件需要计时器处于启用状态,由此可推断,计时器状态的改变导致这个方法被提前终止。
3.第二个线程随后在其结束前又开启了计时器,导致Tick事件发生,然后线程启动,又转到前一种状态。
4.线程对象创建以后,由系统独立地进行调度,线程方法也不同于普通方法,线程结束以后,控制权转移到系统。
这些是基于我对线程的认识所做的分析,不一定准确。
另外,这个结果应该还会受到线程调度的影响,如果在Tick事件处理方法中创建的线程没有立刻被调度,也不会出现这种情况。
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秒钟后又开了一个新的任务
我觉得我可能中间某个环节认识有误,我把自认为的执线路线说一下,您帮我看看哪个地方理解错了?谢谢!
我把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; //这里为何只执行一次 ”?
------------------------------------
红字的那一句,指的是什么?
不过我现在还有些疑惑,你怎么确定的“ int y = 1; //这里为何只执行一次 ”?
#8
TO: dancingbit
红字的那一句就是
newThread = new Thread(DoWork); newThread.Start();
即如果没有timer.stop()这一句,每10秒就会执行到红字的那一句就是
-----------------------------------------
你怎么确定的“ int y = 1; //这里为何只执行一次 ”?
我用断点看的,因为主要是DoWork()执行一次就没执行了,我想确实是否只执行了一次。所以加了int y = 1; 当试验的,
红字的那一句就是
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
貌似断点对线程是不起作用的,楼主还是要用其他的方法来验证是否真的只执行了一次
----------------------------------------
我用写文本的方式验证过了
你的意思是:你发现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
可是以上的DoWork()执行了一次~~
而且如果去掉timer1.Stop(); 和timer1.start();也能不断执行。
所以并不是效的。
#16
有谁知道吗? 谢谢!
#17
再顶一天
#1
Timer在Stop之后再Start,从头开始计时,所以这个DoWork执行得快的话,Tick根本来不及发生。
#2
int y = 1; //这里为何只执行一次
具体的时间设置,如果tick 为1min 执行了两分钟,那么,tick没作用了吧
具体的时间设置,如果tick 为1min 执行了两分钟,那么,tick没作用了吧
#3
我时间每5秒触发一次,与每500ms触发一次都试过,都不可以.
#4
不太明白~~
timer从头开始计时的话,会影响当前线程吗?或者说DoWork() 执行完后,无论如何会返回去吧?
一时想不通,不要见笑。谢谢!
#5
1.这两个方法在不同的线程中执行。
2.第二个线程启动后,立刻执行Timer的Stop,由于Tick事件需要计时器处于启用状态,由此可推断,计时器状态的改变导致这个方法被提前终止。
3.第二个线程随后在其结束前又开启了计时器,导致Tick事件发生,然后线程启动,又转到前一种状态。
4.线程对象创建以后,由系统独立地进行调度,线程方法也不同于普通方法,线程结束以后,控制权转移到系统。
这些是基于我对线程的认识所做的分析,不一定准确。
另外,这个结果应该还会受到线程调度的影响,如果在Tick事件处理方法中创建的线程没有立刻被调度,也不会出现这种情况。
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秒钟后又开了一个新的任务
我觉得我可能中间某个环节认识有误,我把自认为的执线路线说一下,您帮我看看哪个地方理解错了?谢谢!
我把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; //这里为何只执行一次 ”?
------------------------------------
红字的那一句,指的是什么?
不过我现在还有些疑惑,你怎么确定的“ int y = 1; //这里为何只执行一次 ”?
#8
TO: dancingbit
红字的那一句就是
newThread = new Thread(DoWork); newThread.Start();
即如果没有timer.stop()这一句,每10秒就会执行到红字的那一句就是
-----------------------------------------
你怎么确定的“ int y = 1; //这里为何只执行一次 ”?
我用断点看的,因为主要是DoWork()执行一次就没执行了,我想确实是否只执行了一次。所以加了int y = 1; 当试验的,
红字的那一句就是
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
貌似断点对线程是不起作用的,楼主还是要用其他的方法来验证是否真的只执行了一次
----------------------------------------
我用写文本的方式验证过了
你的意思是:你发现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
可是以上的DoWork()执行了一次~~
而且如果去掉timer1.Stop(); 和timer1.start();也能不断执行。
所以并不是效的。
#16
有谁知道吗? 谢谢!
#17
再顶一天