请教下System.Windows.Forms.Timer到底是不是单线程的。

ufo20020427 2009-08-12 11:10:31
我看帮助文档说这个是单线程的,但我下面试验有些不解。

试验一:

我timer1的Interval设为500

private void timer1_Tick(object sender, EventArgs e)
{

MessageBox.Show("test");

Thread.Sleep(2000);
}

如果是单线程的,当弹出第一个"test"后,由于Thread.Sleep(2000);的阻塞,
第二个对话框应至少2秒后才能弹出,但实际上Thread.Sleep(2000);这一句加与没加的效果相同,都是500毫秒弹出一次"test"。感觉就像多线程的。

可是当我改成下面后

试验二:

private void timer1_Tick(object sender, EventArgs e)
{

Thread.Sleep(2000);
MessageBox.Show("test");

}

"test"并没弹出,而是出现窗口卡住了,这又是怎么回事呢(我用断点也不能拦到)
谢谢!


...全文
272 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
chendong152 2011-07-28
  • 打赏
  • 举报
回复
的确想不明白。
foman 2009-08-14
  • 打赏
  • 举报
回复
首先肯定是是单线程的
winform的timer应该基于消息的。

第一种情况:messagebox也是窗体,弹出MessageBox后,消息由Messagebox处理函数处理,这时timer的到时消息传送过来,messagebox又会调用timer1_Tick,又一个messagebox产生,而且消息又转交给它,又产生一个messagbox,如此反复,所以sleep 也根本不会运行到。
第二种情况其实也一样:只不过ui线程sleep时 , 窗体失去响应,2000ms应该是太长了,还没等刷新界面,又sleep了,设的短点,应该可以看到messagebox。
sanwasou 2009-08-14
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 ufo20020427 的回复:]
我的目的是作一个任务计划执行程序。

timer每n秒解发一次,但任务里执行的总时间大于timer的间隔。
也就是说我要保证每个任务完整的执行完,timer才能再次触发。
我用System.Windows.Forms.Timer就是看中他的单线程式,可是试验后,我任务还没执行完,timer就触发了(也就成了多线程了)。请问如何解决。谢谢!


[/Quote]
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

Timer1.Enabled = False

''具体任务执行函数
fncMethod()


Timer1.Enabled = True


End Sub

这样MS 可以解决你说的问题
ufo20020427 2009-08-14
  • 打赏
  • 举报
回复
我的目的是作一个任务计划执行程序。

timer每n秒解发一次,但任务里执行的总时间大于timer的间隔。
也就是说我要保证每个任务完整的执行完,timer才能再次触发。
我用System.Windows.Forms.Timer就是看中他的单线程式,可是试验后,我任务还没执行完,timer就触发了(也就成了多线程了)。请问如何解决。谢谢!

ufo20020427 2009-08-14
  • 打赏
  • 举报
回复
TO:softlove03

private void timer1_Tick(object sender, EventArgs e)
{
MessageBox.Show("test"); //系统响应messagebox消息,500ms一次
Thread.Sleep(2000); //UI线程等待。
}
是不是得这样理解,Thread.Sleep(2000); 没有阻止timer500ms触发一次的事实?
如果是多线程很好理解,可是单线程的,timer的第二次难道不用等Thread.Sleep(2000); 执行完吗?
谢谢!
Deathsign 2009-08-14
  • 打赏
  • 举报
回复
单线程吧……
ufo20020427 2009-08-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zhaoweiting0609 的回复:]
不是太明白楼主说的问题
你每500毫秒调用一次的话,它应该是500毫秒弹出一次啊
因为你每次都启动了一次线程
第二个,你是等待时间超过了2000毫秒还没有反应?还是就是死了
[/Quote]


因为你每次都启动了一次线程
-----------------------
那就是多线程了?可资料上都说这是单线程的~~
tangzhiping121603 2009-08-14
  • 打赏
  • 举报
回复
楼主,其实按照你的想法,应该可以利用System.Windows.Forms.Timer的单线程式实现。
你可以设一个布尔型变量,该变量标识任务是否执行完毕。然后在timer的触发事件中判断,如果任务执行完毕,就开始执行下一个事件;若没有,就不执行。这样不就可以了?
guo40 2009-08-12
  • 打赏
  • 举报
回复
healer_kx 2009-08-12
  • 打赏
  • 举报
回复
VS2005里面,好像是,到了VS2008,好像就不是了。。。我也很晕了。
不过不管是不是,你都应该用多线程的方式进行回答,
Control.Invoke~
  • 打赏
  • 举报
回复
System.Windows.Forms.Timer 500ms向窗体发送一次消息,时间间隔不精确。

private void timer1_Tick(object sender, EventArgs e)
{
MessageBox.Show("test"); //系统响应messagebox消息,500ms一次
Thread.Sleep(2000); //UI线程等待。
}



private void timer1_Tick(object sender, EventArgs e)
{
Thread.Sleep(2000); //UI线程等待。
MessageBox.Show("test"); //系统响应messagebox消息,2000ms一次。由于timer500ms向窗体发送一次消息,会有部分消息丢失。

}
xuejie09242 2009-08-12
  • 打赏
  • 举报
回复
e 有timer的多线程版本。楼主注意查一下资料。
风之影子 2009-08-12
  • 打赏
  • 举报
回复
是单线程的。
hecker728 2009-08-12
  • 打赏
  • 举报
回复
不是很清楚,学习
zhaoweiting0609 2009-08-12
  • 打赏
  • 举报
回复
不是太明白楼主说的问题
你每500毫秒调用一次的话,它应该是500毫秒弹出一次啊
因为你每次都启动了一次线程
第二个,你是等待时间超过了2000毫秒还没有反应?还是就是死了
zhaoweiting0609 2009-08-12
  • 打赏
  • 举报
回复
不是太明白楼主说的问题
你每500毫秒调用一次的话,它应该是500毫秒弹出一次啊
因为你每次都启动了一次线程
第二个,你是等待时间超过了2000毫秒还没有反应?还是就是死了
#### 收益: 学习《optee系统开发精讲 》套餐的收益如下:1、全体系的掌握optee的核心知识点(多核多线程、启动流程、各类API、TA/PTA/STA、driver、service、各类设计思想、内存管理、中断管理...);2、掌握TEE OS的设计核心思想(不限与optee,对其它TEE也是如此),能够进入软件架构层次的各项设计;3、快速熟悉大系统软件的各项组件,能够进行大系统软件之间的设计或排查问题4、学习和理解理解Armv8/Armv9架构、Trustzone架构5、技术水平提升N个level, 掌握快速的学习方法;#### 课程简介和大纲 该课程包含但不限与以下章节:optee的组件介绍optee os启动流程optee os的初始化流程optee os线程向量表及其作用进入optee os的八种方式optee os的异常向量表和设计模型optee os对irq中断的处理optee os对fiq中断的处理optee os的内存管理optee os的MMU的使用optee os的根密钥(信任根)optee os的RPC机制optee os的存储系统optee os的SFS系统optee os的RPMB机制的实现optee os的Timer实现optee os中实现的GP APIoptee os中的系统调度optee os中密码学函数的支持optee os中的线程调度CA/TA的开发模型optee os中的serviceoptee os中的 PTAoptee os中的 secure driveroptee os中的 Early TAoptee中spinlock的实现原理详解optee中mutex的实现方式optee的栈指针和栈内存的介绍optee中使用虚函数(平台客制化)的设计模型共享内存的介绍optee os的标准错误码TA的签名和验签TA链接静态库的方法

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧