2011-11-16 1 views
2

개인 메시지 대기열에서 메시지를 가져 오는 Windows 서비스 (C# 4.0)가 있고 각 메시지에 대해 메시지 내용을 기준으로 하나 이상의 전자 메일 (일반적으로 최대 4 또는 5)을 보냅니다.단일 스레드 Windows 서비스 지연 OnStop

메시지 량이 적어서 복잡성을 피하고 서비스는 sinlge-threaded이지만 이메일은 중요하므로 SCM 중지 명령에서 모든 in-process 메시지/전자 메일이 처리/전송되도록해야합니다. 중지가 완료되었습니다.

OnStop에서 상태를 나타내는 정적 "inProcess"플래그를 확인 중이며 설정된 경우 ServiceBase.RequestAdditionalTime (120000)을 호출합니다.

  1. [중지 명령 2 분의 요청에도 불구하고, 보내지 않은 일부 전자 메일로 즉시 완료 :

    2 문제가 있습니다.

  2. 효과가 있었다고해도 나는 얼마나 오래 기다려야하는지 추측하고 있습니다.

단일 스레드 서비스에서 이것을 처리하는 가장 좋은 방법은 무엇입니까?

도움 주셔서 감사합니다.

그렉

+0

OK, 둥근에 대한 답변은 실제로 아래 답변에 따라 매우 간단합니다. 마지막 메시지 OnStop의 완료를 강제하지 않고 대신 단지 Queue.EndPeek()을 호출 한 다음 현재 메시지를 대기열에 다시 놓습니다. 다시 시작됩니다. 때로는 분명히 우리를 도망칩니다 .... – Serexx

답변

0

완전히 우리는 당신의 메시지 처리 루프의 구조를 볼 필요가 거라고 대답합니다. 그러나 내가 생각하는 한가지는 중지 명령 (또는 일시 중지, 계속, 시작)이 너무 오래 걸리는 경우 SCM이 불평을하지 않도록하기 위해 ServiceBase.RequestAdditionalTime() 메서드를 사용한다는 것입니다. 서비스가 중지되기 전에 2 분간 기다리는 것은 아닙니다.

따라서 느린 중지 프로세스가있는 경우 SCM이 중지 요청시 오류를 방지합니다. 여기

참조 MSDN : 당신이 OnStop()에서 전화를받을 및 일부 완료 플래그를 설정하고,이 플래그를 볼 때 처리 루프는 즉시 종료하는 경우 RequestAdditionalTime() method

내가 궁금하네요 것은?

코드를 게시하면이 답변을 구체화하는 데 도움이되지만 질문을 통해 2 분 동안 기다려야 전화가 걸릴 것으로 예상되는지 궁금해하지만 처리를 위해 뭔가를 설정하고 있습니다. 루프를 중지하십시오. 이것이 사실이 아니라면 나는 그 해답을 더 상세하게 다듬을 수있다.

기다려야하는 시간은 이메일의 중요도와 대기열에 포함될 가능성이 얼마나 많은지, 서비스가 다시 시작되면 중단 된 부분부터 다시 시작될 수 있도록 어느 곳에서나 유지되는 경우에 따라 달라집니다.

+0

RequestMoreTime() 명확히 해 주셔서 감사합니다 - 나는 옛날 국수를 사용하지 않았다 - 당연히 여기에 단 하나의 스레드가 있으므로 RequestMoreTime()이 내가 생각한대로 할 수있는 방법이 없다. . 위의 내 의견을 볼 수 있지만 메시지를 지속에 대한 귀하의 의견 트릭 않았다. 감사! – Serexx

+0

@Serexx : 기꺼이 도와 드리겠습니다! 우리는 수시로 옛 국면에 물린 적이 있습니다. :-) –