2009-09-22 5 views
1

VSTS 2008 + C# + .Net 3.5를 사용하여 Windows 서비스 응용 프로그램을 개발 중입니다. 코드는 아래에서 매우 간단합니다. File.Copy가 예외를 throw하면 (예 : 유효하지 않은 경로, 권한 없음 등) 서비스가 중단되고 디버그 할 수있는 대화 상자가 팝업됩니다. 내 혼란은, 나는 윈도우 서비스에 의해 생성 된 스레드의 처리되지 않은 예외가 결코 서비스 충돌을 일으키지 않을 것이라고 생각한다. 서비스가 중단되고 디버그 대화 상자가 팝업되는 이유는 무엇입니까?Windows 서비스가 중단되는 이유는 무엇입니까?

public partial class Service1 : ServiceBase 
    { 
     public Service1() 
     { 
      InitializeComponent(); 
     } 

     protected override void OnStart(string[] args) 
     { 
      Thread t = new Thread (WriteF); 
      t.Start(); 
     } 

      static void WriteF() { 
       File.Copy("dummy.txt", @"\\somelocation\dummy.txt"); 
      } 

     protected override void OnStop() 
     { 
     } 
    } 
+1

오류 ... 버그가 있기 때문에? – wefwfwefwe

+0

가상 점 수입니다. 대답 할 동기는 어디입니까? 나는 그것이 다른 것이라고 생각했다. – Khash

답변

6

나는 Windows 서비스에 의해 생성 된 스레드의 처리되지 않은 예외가

당신의 가정은 단순히 잘못된 서비스 충돌을하지 않습니다 생각합니다. Windows 서비스에서 처리되지 않은 예외로 인해 충돌이 발생합니다. 시스템에 디버거가 구성되어 있기 때문에 디버그 대화 상자가 나타납니다. .NET 2.0 이상에서는 모든 스레드에서 처리되지 않은 예외가 발생하면 전체 응용 프로그램이 종료됩니다. 스레드를 사용하고 있기 때문에 스레드의 예외가 마술처럼 사라지는 것은 아닙니다.

+0

Windows 서비스의 모든 스레드에서 예외가 발생하면 Windows 서비스가 중단됩니까? – George2

+2

예. 이것은 서비스에 고유하지 않으며, 모든 애플리케이션에서 동일합니다. – blowdart

+0

감사합니다. 질문에 답변했습니다! – George2

2

파일 복사 작업에서 캐치되지 않은 예외가 발생합니다. 그처럼 간단합니다. try catch 블록에서 File.Copy 작업을 래핑하지 않으면 서비스가 실패합니다. 작업이 백그라운드 스레드에서 수행되고 있다는 것은 중요하지 않습니다. 또한 로깅을 추가하는 것이 좋습니다. 그렇지 않으면 실패한 이유를 알 수 없습니다.

+1

이것이 동일한 지 확신 할 수는 없지만 서비스에서 전에 메인 스레드 (서비스를 보유하지 않는 것으로 실행되는 스레드)를 작성했습니다. 그런 다음 사용자 목록을 검색하고 사용자를 반복하여 각 사용자가 작업을 수행 할 수있는 스레드를 만듭니다. 스레드가 처리되지 않은 예외를 가진 이벤트에서 다른 스레드가 완료됩니다. 나는 무엇인가를 내놓고 있는가, 아니면 질문이 무엇과 다른가? –

+0

Windows 서비스의 모든 스레드에서 예외가 발생하면 Windows 서비스가 중단됩니까? – George2

0

WriteF에서 코드를 실행하기위한 새 스레드를 시작합니다. 이 코드가 예외와 함께 실패하면 런타임은 해당 스레드에 대한 스택을 푸는 것으로 예외 처리기를 찾으려고 시도합니다. 핸들러 찾기에 실패하면 런타임에는 옵션이 없지만 처리되지 않은 예외를보고하므로 프로세스가 종료됩니다. 예외 처리는 스레드별로 수행됩니다. 이것은 Windows 서비스 문제가 아닙니다.

관련 문제