首页 新闻 会员 周边 捐助

System.Timers.Timer 多线程 ,同时首次进

0
悬赏园豆:50 [已关闭问题]
<P>声明: <BR>System.Timers.Timer&nbsp;timer&nbsp;=&nbsp;new&nbsp;System.Timers.Timer(); <BR>timer.Elapsed&nbsp;+=&nbsp;new&nbsp;ElapsedEventHandler(timer_Elapsed); <BR><BR>button按钮事件: <BR>timer.AutoReset&nbsp;=&nbsp;true; <BR>timer.Interval&nbsp;=15; <BR>timer.Start&nbsp;(); <BR><BR>timer调用的函数: <BR>void&nbsp;timer_Elapsed(object&nbsp;sender,&nbsp;ElapsedEventArgs&nbsp;e) <BR>{ <BR>&nbsp;Console.Out.WriteLine(DateTime.Now&nbsp;+"&nbsp;"+&nbsp;DateTime.Now.Millisecond.ToString()&nbsp;+&nbsp;"timer&nbsp;in:"&nbsp;+&nbsp;nCountTimer.ToString()); <BR>} <BR><BR>运行结果: <BR>运行程序后第一次点击button事件: <BR>2008-5-8&nbsp;17:38:21&nbsp;170timer&nbsp;in:0 <BR>2008-5-8&nbsp;17:38:21&nbsp;170timer&nbsp;in:1 <BR>2008-5-8&nbsp;17:38:21&nbsp;190timer&nbsp;in:2 <BR>2008-5-8&nbsp;17:38:21&nbsp;210timer&nbsp;in:3 <BR>不解?为什么前2次进入的时间相同?(每次尝试都是这样) <BR><BR>第二次点击button事件: <BR>2008-5-8&nbsp;17:38:23&nbsp;383timer&nbsp;in:0 <BR>2008-5-8&nbsp;17:38:23&nbsp;403timer&nbsp;in:1 <BR>2008-5-8&nbsp;17:38:23&nbsp;423timer&nbsp;in:2 <BR>2008-5-8&nbsp;17:38:23&nbsp;443timer&nbsp;in:3 <BR>2008-5-8&nbsp;17:38:23&nbsp;463timer&nbsp;in:4 <BR>运行正常,20ms进入一次,但我设置的进入间隔为15ms!</P> <P>&nbsp;</P> <P>再请教一下 如何让timers.timer单线程执行?lock怎么用?我加上了还是会同时多次进入!</P>
问题补充: 附加独立测试代码 using System; using System.Collections.Generic; using System.Windows.Forms; using System.Timers; namespace WindowsApplication3 { static class Program { /// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main() { System.Timers.Timer timer = new System.Timers.Timer(); timer.Elapsed += new ElapsedEventHandler(timer_Elapsed); timer.AutoReset = true; timer.Interval =60; timer.Start(); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } public static void timer_Elapsed(object sender, ElapsedEventArgs e) { Console.Out.WriteLine(DateTime.Now + " " + DateTime.Now.Millisecond + " "+DateTime .Now.TimeOfDay.TotalMilliseconds ); } } } 运行结果: 间隔都设置到60了 初次进入达到了3次 2008-5-9 10:08:38 155 36518155.912 2008-5-9 10:08:38 155 36518155.912 2008-5-9 10:08:38 155 36518155.912 2008-5-9 10:08:38 185 36518185.9552 2008-5-9 10:08:38 246 36518246.0416 2008-5-9 10:08:38 306 36518306.128 2008-5-9 10:08:38 366 36518366.2144 2008-5-9 10:08:38 426 36518426.3008 2008-5-9 10:08:38 486 36518486.3872 2008-5-9 10:08:38 546 36518546.4736 2008-5-9 10:08:38 606 36518606.56 2008-5-9 10:08:38 666 36518666.6464
wills的主页 wills | 初学一级 | 园豆:135
提问于:2008-05-09 10:08
< >
分享
其他回答(2)
0
Timer的即时机制不是很准确, 如果你要的精度很高的话,恐怕很难时间 建议改成 轮训+DoEvents 另外,Timer本是内置线程池,因此是多线程的,想要变成单线程,估计。。 使用LOCK等,锁定一个全局变量访问,具体可以参考MSDN。.NET 也内置的系统的同步机制
G yc {Son of VB.NET} | 园豆:2006 (老鸟四级) | 2008-05-10 15:19
0
如果是在winform下使用可以使用System.Windows.Forms.Timer试试。 不过确实如G yc {Son of VB.NET} 所说,理论上不可能保证准确,因为系统中运行的不止一个进程;如果到了时间你的程序没有得到cpu时间,那肯定会不准的。
玉开 | 园豆:8822 (大侠五级) | 2008-05-14 11:18
0
建议自己开个线程比较稳妥.
Animax! | 园豆:315 (菜鸟二级) | 2008-05-23 20:31
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册