gpt4 book ai didi

c# - Windows 服务中的可重入计时器

转载 作者:行者123 更新时间:2023-11-30 13:40:16 25 4
gpt4 key购买 nike

我想建立一个windows服务,它应该在不同的时间执行不同的方法。它与准确性无关。我正在使用 system.timers.timer,并使用计数器调节要在 Eventhandler 方法中执行的不同方法。到目前为止一切正常。

所有方法都访问一个 COM 端口,因此必须一次只授予一个方法访问权限。但是由于这些方法可能需要一些时间才能完成,计时器可能会再次计时,并希望在 COM 端口仍被占用时执行另一个方法。在这种情况下,事件可以而且应该被取消。

简化为一种方法,我的 elapsedEventHandler 方法如下所示(try-catch 和此处排除的不同方法)

注意:虽然这在我的 Win7 x64 上运行完美,但在安装了几乎相同软件的 Win7 x86 机器上,只要执行该方法需要很长时间,它就会遇到困难。计时器不再滴答作响,不会抛出任何异常。没有什么!我现在的问题是:我是否正确地完成了访问控制和计时器的部分,以便我可以专注于其他事情?我只是不太熟悉计时器,尤其是线程

     private static int m_synchPoint=0;
private System.Timers.Timer timerForData = null;

public MyNewService()
{

timerForData = new System.Timers.Timer();
timerForData.Interval = 3000;
timerForData.Elapsed += new ElapsedEventHandler(Timer_tick);
}
//Initialize all the timers, and start them
protected override void OnStart(string[] args)
{

timerForData.AutoReset = true;
timerForData.Enabled = true;
timerForData.Start();
}

//Event-handled method
private void Timer_tick(object sender, System.Timers.ElapsedEventArgs e)
{
////safe to perform event - no other thread is running the event?
if (System.Threading.Interlocked.CompareExchange(ref m_synchPoint, 1, 0) == 0)

{
//via different else-ifs basically always this is happening here, except switching aMethod,bMethod...
processedevent++;
Thread workerThread = new Thread(aMethod);
workerThread.Start();
workerThread.Join();
m_synchPoint=0;
}
else
{
//Just dismiss the event
skippedevent++;
}
}

非常感谢您!
非常感谢任何帮助!

最佳答案

我建议使用 System.Threading.Timer 来实现此功能。您可以在计时器执行时禁用它,处理您的数据,然后重新启用计时器。

编辑:

我认为使用 System.Threading.Timer 更有意义,因为没有理由需要将计时器放在设计界面上,这几乎是唯一的理由使用 System.Timers.Timer。我真的希望 MS 无论如何都能删除它,它包装了 System.Threading.Timer,这首先并不难使用。

是的,您确实存在重入问题的风险,这就是我指定将超时更改为Timeout.Infinite 的原因。如果您使用 Timeout.Infinite 构建计时器,您将不会遇到此重入问题。

public class MyClass
{
private System.Threading.Timer _MyTimer;

public MyClass()
{
_MyTimer = new Timer(OnElapsed, null, 0, Timeout.Infinite);
}

public void OnElapsed(object state)
{
_MyTimer.Change(Timeout.Infinite, Timeout.Infinite);
Console.WriteLine("I'm working");
_MyTimer.Change(1000, Timeout.Infinite);
}

关于c# - Windows 服务中的可重入计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8459118/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com