나는 기본적으로 다음 코드를 실행하는 Windows 서비스 일하고 :예외가 잡힐 때 타이머 콜백이 중지되는 이유는 무엇입니까?
public class ServiceController
{
private FundsEngine _fundsEngine;
protected override void OnStart(string[] args)
{
var logsPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "logs");
if (Directory.Exists(logsPath) == false)
{
Directory.CreateDirectory(logsPath);
}
_fundsEngine = new FundsEngine();
_fundsEngine.Start();
}
}
서비스는 지정된 간격에 코드를 실행하도록 타이머를 사용하는 클래스입니다 "엔진"을 시작할 수 있습니다.
다음 클래스는 System.Threading.Timer
을 사용하여 콜백 (OnTick()
)을 5 초마다 호출하는 엔진의 예입니다. 아래에 도시 된 바와 같이 로그
public class FundsEngine
{
private System.Threading.Timer _timer;
private static Logger _logger = LogManager.GetCurrentClassLogger();
public void Start()
{
_logger.Trace("Begin Start");
try
{
// details omitted
_timer = new Timer(OnTick);
_timer.Change(5000, Timeout.Infinite);
}
catch (Exception exception)
{
_logger.ErrorException("Error in Start.", exception);
}
finally
{
_logger.Trace("End Start");
}
}
private void OnTick(object state)
{
_logger.Trace("Begin Tick");
try
{
// do stuff
_timer.Change(5000, Timeout.Infinite);
}
catch (Exception exception)
{
_logger.ErrorException("Error in Tick. ", exception);
}
finally
{
_logger.Trace("End Tick");
}
}
}
, 상기 타이머는 OnTick()
방법 5 초마다 호출 예상 작동으로. 예외가 OnTick()
메소드 내에서 캐치되는 경우에
2013-05-14 16:27:01.2261|TRACE|Begin Start
2013-05-14 16:27:03.8514|TRACE|End Start
2013-05-14 16:27:08.8569|TRACE|Begin Tick
2013-05-14 16:27:08.8709|TRACE|End Tick
2013-05-14 16:27:13.8734|TRACE|Begin Tick
2013-05-14 16:27:13.8734|TRACE|End Tick
2013-05-14 16:27:18.8809|TRACE|Begin Tick
2013-05-14 16:27:18.8809|TRACE|End Tick
2013-05-14 16:27:23.8894|TRACE|Begin Tick
2013-05-14 16:27:23.8894|TRACE|End Tick
2013-05-14 16:27:28.8969|TRACE|Begin Tick
2013-05-14 16:27:28.8969|TRACE|End Tick
2013-05-14 16:27:33.9044|TRACE|Begin Tick
2013-05-14 16:27:33.9044|TRACE|End Tick
, 내 기대는 기록되고, 서비스가
OnTick()
방법 5 초에 다시 호출됩니다 있도록, 계속 실행하는 것입니다. 그러나 예외가 처리 된 후에 콜백이 다시 호출되지 않으므로이 경우가 아닙니다. 왜 이런거야?
2013-05-14 16:29:03.8574|TRACE|Begin Start
2013-05-14 16:29:03.8574|TRACE|End Start
2013-05-14 16:29:08.8709|TRACE|Begin Tick
2013-05-14 16:29:09.9750|ERROR|Error in Tick. System.Net.Sockets.SocketException (0x80004005): No connection could be made because the target machine actively refused it 127.0.0.1:22
2013-05-14 16:29:09.9750|TRACE|End Tick
모든 점을 수정하십시오. 원본 본문을 편집하여 누락 된 세부 사항을 표시합니다. 내가 그것을 놓쳤던 방법을 명확히하지 않고있다. 그러나 그것은 명백하게 완전한 의미를 가진다. –