c#,用了多个timer控件,若同时响应,有优先级问题吗? 在程序中用了多个timer控件,有可能在执行timer1_Tick中程序时,timer2_Tick被触发,程序会怎样执行?有优先级问题吗? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 楼主你最好不要同时使用多个timer有人说:主要原因是System.Windows.Forms以及System.Threading.Timer的Timer同时运行多个的时候会产生令人发狂的错乱,停止其中一个Timer的时候,可能会引发其他Timer注册的事件,对此类灵异事件,查遍互联网后只在MSDN发现了这么一段说明:由于所有 Timer 组件都在主应用程序线程上操作,所以在 Windows 窗体应用程序中的任意 Timer 上调用 Stop 都可以导致来自应用程序中其他 Timer 组件的消息被立即处理。如果有两个 Timer 组件,分别设置为 700 毫秒和 500 毫秒,并且从第一个 Timer 调用 Stop,则应用程序可能首先接收第二个组件的事件回调。如果这证明有问题,请考虑转为使用 System.Threading 命名空间中的 Timer 类。 Timer应该是单线程的,跟窗体同一线程,所以应该是轮流执行如果其中一个执行时间要很久,其它Timer也得等它执行完 请考虑转为使用 System.Threading 命名空间中的 Timer 类这个timer是在ThreadPool中处理事件的,你可以放心用 Timer应该是单线程的,也可以说是独占执行的。它里面的代码不会受别的Timer执行的影响,所以你的想法不会实现。 System.Timers.Timer timer1= new System.Timers.Timer(); timer1.Elapsed += new System.Timers.ElapsedEventHandler(Method); timerUDRLThread.Interval = 10;//响应间隔private void Method(object sender, ElapsedEventArgs e){ //Todo } timerUDRLThread.Interval = 10;//响应间隔 改为timer1.Interval = 10;//响应间隔 不要用多个timer ,无论是System.Windows .Forms .Timer还是System.Timers.Timer以下这个例子就可以说明,2个计时器都是100毫秒触发一次,但第一个timer里处理时间>100毫秒,这里用sleep1秒模拟,这样应该1秒后a=1,而b=10,但结果是a和b相差无几,说明第2个计时器被阻塞了,用System.Windows .Forms .Timer更明显using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace WindowsFormsApplication7{ public partial class Form1 : Form { int a = 0, b = 0; public Form1() { InitializeComponent(); System.Timers.Timer timer1 = new System.Timers.Timer(); timer1.Elapsed += new System.Timers.ElapsedEventHandler(timer1_Elapsed); timer1.Interval = 100; timer1.Enabled = true; System.Timers.Timer timer2 = new System.Timers.Timer(); timer2.Elapsed += new System.Timers.ElapsedEventHandler(timer2_Elapsed); timer2.Interval = 100; timer2.Enabled = true; } void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { ++a; this.Invoke(new Action(X)); System.Threading.Thread.Sleep(1000); } void timer2_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { b++; this.Invoke(new Action(X)); } void X() { this.Text ="a:"+ a.ToString() + " b:"+b.ToString(); } }} 先声明一个方法用于Timer事件回调public void timerCallback(object stat){}然后System.Threading.Timer timer = new System.Threading.Timer(new TimerCallback(tim),null,0,5000);这样计时器timer将立即触发一次timerCallback,之后每5000毫秒再触发一次 你在timer的事件里写个死循环 看看主窗体还能不能用? 杞人忧天 为什么checkbox要点很多下才能选中? 如何更改tableadapter的connection属性 一个指向对象引用的变量,所占内存是多大,如何查出来,这样的变量所占内存都一样大吗? c#用socket接收客户端的信息后如何应答?(在线等) 老板给了个要求,希望大家帮忙想办法 怎样才能调试我的第一个C#代码 关于第三方控件WebCombo的取值问题 C# winform中怎么显示使用SQL语句得到的结果 急急急!!!c#动态生成表格时遇到的怪问题 xmlns是什么意思? 关于系统内消息的提醒怎么做?高手给个建议! 当复制DataGridView控件中的一整行 报异常
有人说:
主要原因是System.Windows.Forms以及System.Threading.Timer的Timer同时运行多个的时候会产生令人发狂的错乱,停止其中一个Timer的时候,可能会引发其他Timer注册的事件,对此类灵异事件,查遍互联网后只在MSDN发现了这么一段说明:由于所有 Timer 组件都在主应用程序线程上操作,所以在 Windows 窗体应用程序中的任意 Timer 上调用 Stop 都可以导致来自应用程序中其他 Timer 组件的消息被立即处理。如果有两个 Timer 组件,分别设置为 700 毫秒和 500 毫秒,并且从第一个 Timer 调用 Stop,则应用程序可能首先接收第二个组件的事件回调。如果这证明有问题,请考虑转为使用 System.Threading 命名空间中的 Timer 类。
timer1.Elapsed += new System.Timers.ElapsedEventHandler(Method);
timerUDRLThread.Interval = 10;//响应间隔
private void Method(object sender, ElapsedEventArgs e)
{
//Todo
}
改为
timer1.Interval = 10;//响应间隔
2个计时器都是100毫秒触发一次,
但第一个timer里处理时间>100毫秒,这里用sleep1秒模拟,
这样应该1秒后a=1,而b=10,但结果是a和b相差无几,
说明第2个计时器被阻塞了,
用System.Windows .Forms .Timer更明显using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;namespace WindowsFormsApplication7
{
public partial class Form1 : Form
{
int a = 0, b = 0;
public Form1()
{
InitializeComponent(); System.Timers.Timer timer1 = new System.Timers.Timer();
timer1.Elapsed += new System.Timers.ElapsedEventHandler(timer1_Elapsed);
timer1.Interval = 100;
timer1.Enabled = true; System.Timers.Timer timer2 = new System.Timers.Timer();
timer2.Elapsed += new System.Timers.ElapsedEventHandler(timer2_Elapsed);
timer2.Interval = 100;
timer2.Enabled = true;
} void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
++a;
this.Invoke(new Action(X));
System.Threading.Thread.Sleep(1000);
}
void timer2_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
b++;
this.Invoke(new Action(X));
} void X()
{
this.Text ="a:"+ a.ToString() + " b:"+b.ToString();
}
}
}
先声明一个方法用于Timer事件回调
public void timerCallback(object stat)
{
}然后System.Threading.Timer timer = new System.Threading.Timer(new TimerCallback(tim),null,0,5000);这样计时器timer将立即触发一次timerCallback,之后每5000毫秒再触发一次
杞人忧天