从Windows服务执行不稳定的代码

时间:2017-07-15 01:32:20

标签: c# windows windows-services

我在StackOverflow上的第一篇文章。

我在传统上使用C#在各种版本的Visual Studio(主要是2010)中开发了Windows窗体应用程序,但其任务是开发Windows服务(使用VS 2013)。用C#编写,我正在重新利用开发人员不再与我们的组织编写的现有服务。

我会提供代码示例,但问题不在于任何单一方法。我遇到的问题是在调试服务时极其奇怪的代码执行模式。代码可能跳转到您不期望的位置,并且它通常会重复执行应该已经移过的代码。我从未见过这样的事情。几乎就好像有多个实例正在运行,但我无法确认多个实例正在运行。

有没有人对如何发生这种情况有任何建议?

当Stepping Over时,代码可能会从第54行跳到56,然后重复回到54。即使它退回到这种方法中,代码也不会到达第54行,而是先在38或43处停止。

非常感谢您的投入, 迈克尔

Code Screenshot

1 个答案:

答案 0 :(得分:0)

在Windows服务中是:

private System.Timers.Timer _timer;

protected override void OnStart(string[] args)
{
    _timer = new System.Timers.Timer { Interval = 1000 };
    _timer.Elapsed += TimerElapsed;
    _timer.Enabled = true;
}

/// <summary>
/// Event raised every second
/// IsBusy flag ensures no overlapping processing
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void TimerElapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        if (!IsRunning) return;
        if (IsBusy) return; //Line was commented out
        IsBusy = true;
        ProcessRequestLogRecords();
        IsBusy = false;
    }

由于其他地方发生了未处理的错误,IsBusy从未被重置为False,因此在下一个周期中将绕过ProcessRequestLogRecords(它驱动所有服务的功能)。我在跟踪未处理的异常时注释掉了上面指出的行,但是一旦错误得到纠正(可能是一天或更久以后),它就无法取消注释。这允许在调试断点时独立于我监视的周期调用ProcessRequestLogRecords。

经验教训。再次感谢那些贡献的人!我当然感谢你的努力!

迈克尔