【发布时间】:2011-12-10 19:12:33
【问题描述】:
我想构建一个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++;
}
}
非常感谢您!
非常感谢任何帮助!
【问题讨论】:
-
我不知道发布的代码如何重现这个问题。
-
实际上我不能在我的机器上重现这个问题,只能在我正在测试的机器上,我无法在 Visual Studio 中调试。这里的主要问题如下:上面的代码是否正确使用了计时器和比较交换,它保存假设一次只有一个方法在运行? Else:您将如何实现这样的场景?
-
这不是核心问题,但对于应该是特定于实例的数据,不要使用
static(在这种情况下应该是m_synchPoint)。 -
你为什么打电话给
workerThread.Start,紧接着是workerThread.Join?以这种方式做事没有任何好处,因为计时器线程只会等到新线程完成。直接执行aMethod,省去启动新线程的开销。 -
JimMischel:阅读我的 log.debug,在我看来,情况并非如此,这也让我感到惊讶!这有可能吗?我最初的想法是,明确建议服务等待完成...... @bobbymcr:当然是对的,但不是修复=(
标签: c# multithreading windows-services timer interlocked