我在下面提到的代碼中遇到了一個奇怪的問題。我不明白什麼是確切的問題。下面的代碼是Windows服務的一部分。此代碼正在調用一個com類函數在固定時間間隔後對消息隊列執行一些操作。 我爲此使用了System.threading.timer。開始後,服務在一段時間內工作正常,但一段時間後停止工作。Windows服務中的定時器和異常處理
using System;
using System.IO;
using System.ServiceProcess;
using System.Threading;
using CareMC.VBWrapper.RCWQueue;
namespace MSPQueueService
{
public partial class MSPQueueService : ServiceBase
{
static System.Threading.Timer timer;
const int TIMEOUTVALUE = 5000;
private int isBusy = 0;
public MSPQueueService()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
try
{
AppendToLog("ONStart Begin");
//Handle Elapsed event
TimerCallback timerDelegate = new TimerCallback(OnElapsedTime);
timer = new System.Threading.Timer(timerDelegate, null, TIMEOUTVALUE, TIMEOUTVALUE);
//EVENT _objEvent = new EVENT();
//_objEvent.ExecuteMSPQueue();
AppendToLog("ONStart End");
}
catch (Exception ex)
{
string ErrorMessage = ex.Message.ToString();
AppendToLog(ErrorMessage);
}
}
private void OnElapsedTime(object state)
{
//If the isBusy value is 0 then replace it with 1 and continue otherwise it has already been incremented so we're already running
//the handler so skip out
if (Interlocked.CompareExchange(ref isBusy, 1, 0) != 0)
{
AppendToLog("OnElapsedTime is already running. isBusy=" + isBusy.ToString());
return;
}
try
{
EVENT _objEvent = new EVENT();
AppendToLog("Before Executing ExecuteMSPQueue function.");
_objEvent.ExecuteMSPQueue();
AppendToLog("After Executing ExecuteMSPQueue function.");
}
catch (Exception ex)
{
AppendToLog(ex.ToString());
}
finally
{
AppendToLog("Resetting isBusy value to 0=");
Interlocked.Exchange(ref isBusy, 0);
AppendToLog("Value of isBusy after reset =" + isBusy);
};
}
}
下面是從代碼
10/11/2011上午04時15分03秒smaple日誌:執行ExecuteMSPQueue功能之前。
10/11/2011 4:15:08 AM:OnElapsedTime已在運行。
10/11/2011 4:15:13 AM:OnElapsedTime已在運行。
10/11/2011 4:15:18 AM:OnElapsedTime已在運行。
10/11/2011 4:15:19 AM:執行ExecuteMSPQueue函數後。
10/11/2011 4:15:28 AM:OnElapsedTime已在運行。
10/11/2011 4:15:33 AM:OnElapsedTime已在運行。
10/11/2011 4:15:38 AM:OnElapsedTime已在運行。
10/11/2011 4:15:43 AM:OnElapsedTime已在運行。
10/11/2011 4:15:48 AM:OnElapsedTime已在運行。
10/11/2011 4:15:53 AM:OnElapsedTime已在運行。
這意味着IsBusy變量的值保持爲1而不是重置爲0。通過查看代碼,它是唯一可能的,如果有異常不被捕獲塊捕獲(這是可能的?)
請幫助我。
我認爲你應該將相當長的代碼縮短到你認爲是錯誤的實際行。否則,在我看來,這是一個「TL; DR」的帖子。 –