我在StackOverflow上的第一篇文章。
我在传统上使用C#在各种版本的Visual Studio(主要是2010)中开发了Windows窗体应用程序,但其任务是开发Windows服务(使用VS 2013)。用C#编写,我正在重新利用开发人员不再与我们的组织编写的现有服务。
我会提供代码示例,但问题不在于任何单一方法。我遇到的问题是在调试服务时极其奇怪的代码执行模式。代码可能跳转到您不期望的位置,并且它通常会重复执行应该已经移过的代码。我从未见过这样的事情。几乎就好像有多个实例正在运行,但我无法确认多个实例正在运行。
有没有人对如何发生这种情况有任何建议?
当Stepping Over时,代码可能会从第54行跳到56,然后重复回到54。即使它退回到这种方法中,代码也不会到达第54行,而是先在38或43处停止。
非常感谢您的投入, 迈克尔
答案 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。
经验教训。再次感谢那些贡献的人!我当然感谢你的努力!
迈克尔