我有一个Windows服务,可以执行以下操作:
设置:
在同一个计时器过去时,将调用第2点和第3点。有时,第三方Web服务会超时。在这种情况下,我们捕获异常,将其记录在我们的数据库中,然后不再抛出它。我们的想法是,当计时器再次过去时,我们想重新调用Web服务,因为改进第三方服务是我们无法控制的,无论如何这并不经常发生。这是ProcessData()的一些伪代码:
private bool ProcessData()
{
bool hasBeenProcessed = false;
try
{
// Call web service
// If successful
hasBeenProcessed = true;
}
catch(Exception ex)
{
// Log exception
}
return hasBeenProcessed;
}
问题:
我们的Windows服务完全停止工作,即使处理了异常而没有重新抛出。忘记第3步,我们无法在数据库中看到应该作为第2步的一部分完成的任何数据。理想情况下,我们不希望数据收集因数据处理中的问题而受到影响。服务本身在Service Manager中显示为Running。从服务管理器停止服务并不起作用。
问题:
虽然我们现在将这两件事分成两个不同的服务,但我试图找出当前逻辑中出了什么问题?为什么Windows服务没有响应?
答案 0 :(得分:0)
一种可能性是,查询数据并使用数据调用Web服务的时间超过5秒,这样您的计时器事件就会开始相互堆积。
在尝试再次处理数据之前,请考虑使用变量来跟踪您是否正在处理数据。类似的东西:
private bool _processingData = false;
private void _timer_Elapsed(object sender, ElapsedEventArgs e)
{
if (!_processingData)
{
_processingData = true;
QueryForData();
ProcessData();
_processingData = false;
}
}