System.Timers.Timer 多线程问题[转]

[ 已解决问题] System.Timers.Timer 多线程 ,同时首次进
声明:
System.Timers.Timer timer = new System.Timers.Timer();
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);

button按钮事件:
timer.AutoReset = true;
timer.Interval =15;
timer.Start ();

timer调用的函数:
void timer_Elapsed(object sender, ElapsedEventArgs e)
{
 Console.Out.WriteLine(DateTime.Now +" "+ DateTime.Now.Millisecond.ToString() + "timer in:" + nCountTimer.ToString());
}

运行结果:
运行程序后第一次点击button事件:
2008-5-8 17:38:21 170timer in:0
2008-5-8 17:38:21 170timer in:1
2008-5-8 17:38:21 190timer in:2
2008-5-8 17:38:21 210timer in:3
不解?为什么前2次进入的时间相同?(每次尝试都是这样)

第二次点击button事件:
2008-5-8 17:38:23 383timer in:0
2008-5-8 17:38:23 403timer in:1
2008-5-8 17:38:23 423timer in:2
2008-5-8 17:38:23 443timer in:3
2008-5-8 17:38:23 463timer in:4
运行正常,20ms进入一次,但我设置的进入间隔为15ms!

 

再请教一下 如何让timers.timer单线程执行?lock怎么用?我加上了还是会同时多次进入!

提问者: wills - 初学一级

问题补充:附加独立测试代码

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

 
所有回答(3)
Timer的即时机制不是很准确,如果你要的精度很高的话,恐怕很难时间建议改成 轮训+DoEvents 另外,Timer本是内置线程池,因此是多线程的,想要变成单线程,估计。。 使用LOCK等,锁定一个全局变量访问,具体可以参考MSDN。.NET 也内置的系统的同步机制
5个月前   回答者: G yc {Son of VB.NET} - 小虾三级
如果是在winform下使用可以使用System.Windows.Forms.Timer试试。 不过确实如G yc {Son of VB.NET} 所说,理论上不可能保证准确,因为系统中运行的不止一个进程;如果到了时间你的程序没有得到cpu时间,那肯定会不准的。
5个月前   回答者: 玉开 - 大侠五级
建议自己开个线程比较稳妥.

转载于:https://www.cnblogs.com/starspace/archive/2008/11/05/1326761.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
System.Timers.Timer和DispatcherTimer都是用于定时执行任务的计时器类,但它们在使用方式和适用场景上有所不同。 System.Timers.Timer是一个多线程计时器,适用于在后台线程执行周期性任务。它是基于底层的System.Threading.Timer实现的,可以在指定的时间间隔内重复执行任务。以下是一个使用System.Timers.Timer的示例: ```csharp static System.Timers.Timer Timer1 = new System.Timers.Timer(); static void Main() { Timer1.Interval = 1000; // 设置时间间隔为1秒 Timer1.Elapsed += new ElapsedEventHandler(PeriodicTaskHandler); // 绑定事件处理程序 Timer1.Start(); // 启动计时器 } static void PeriodicTaskHandler(object sender, ElapsedEventArgs e) { // 执行周期性任务的代码 } ``` DispatcherTimer是一个UI线程计时器,适用于在UI线程上执行周期性任务。它是基于WPF的Dispatcher对象实现的,可以在指定的时间间隔内重复执行任务,并且可以直接更新UI元素。以下是一个使用DispatcherTimer的示例: ```csharp private void StartTimer() { DispatcherTimer dispatcherTimer = new DispatcherTimer(); dispatcherTimer.Tick += OnTimerHandler; // 绑定事件处理程序 dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0, 100); // 设置时间间隔为100毫秒 dispatcherTimer.Start(); // 启动计时器 } private void OnTimerHandler(object sender, EventArgs e) { string strTime = DateTime.Now.ToString("HH:mm:ss:fff"); // 获取当前时间 lbTime.Content = strTime; // 更新UI元素 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值