System.Timers.Timer就是在worker thread中执行的。你是在winform designer中拖动的吗?如果是,SynchronizingObject会被自动赋值: If the Timer is used inside Visual Studio in a Windows Forms designer, SynchronizingObject is automatically set to the control that contains the Timer. For example, if you place a Timer on a designer for Form1 (which inherits from Form), the SynchronizingObject property of Timer is set to the instance of Form1.自己new一个Timer试一试。
相互影响是不是标志位非线程安全导致的?
可以修改下数据处理流程,使用ManualResetEvent,只有满足条件的情况下,才执行业务逻辑,
否则就等待信号量,不要执行轮询了
if(_time%200==0){
记录Time1
}
if(_time%1000==0){
记录Time2
}
相互影响是不是标志位非线程安全导致的?
可以修改下数据处理流程,使用ManualResetEvent,只有满足条件的情况下,才执行业务逻辑,
否则就等待信号量,不要执行轮询了T1不会操作标志,只有T2可以操作,T1根据标志判断是否需要执行业务。但已经试了多种方式,经常会出现其中一个Timer事件在执行时,另外一个就不执行,很头疼
相互影响是不是标志位非线程安全导致的?
可以修改下数据处理流程,使用ManualResetEvent,只有满足条件的情况下,才执行业务逻辑,
否则就等待信号量,不要执行轮询了T1不会操作标志,只有T2可以操作,T1根据标志判断是否需要执行业务。但已经试了多种方式,经常会出现其中一个Timer事件在执行时,另外一个就不执行,很头疼Timer的使用中还要注意重入问题,建议换成线程吧。
{
if (flag)
{
//log
Console.WriteLine("timer1: "+ e.SignalTime.ToLocalTime());
}
} static void timer2_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
//check and set flag
Random random = new Random(); if (random.Next(0, 10) < 5)
{
Console.WriteLine("====================timer2: " + e.SignalTime.ToLocalTime());
flag = true;
}
else
{
Console.WriteLine("====================timer2: " + e.SignalTime.ToLocalTime());
flag = false;
}
} static void Main(string[] args)
{
System.Timers.Timer timer1 = new System.Timers.Timer(200);
System.Timers.Timer timer2 = new System.Timers.Timer(1000); timer1.Elapsed += timer1_Elapsed;
timer2.Elapsed += timer2_Elapsed;
timer1.Start();
timer2.Start(); Console.Read();
}
搂主 你代码是不是这样的? 是的话 timer1有时候不执行是期望的结果啊,因为flag为false了