문제

C #으로 작성된 Windows 서비스가 있습니다.서비스는 다음을 수행하는 스레드를 생성합니다. 라코 디스

데이터베이스가 사라진 몇 번 후에 Thread.Sleep을 넣고 데이터베이스 연결 오류로 가득 찬 3Gb 로그 파일로 돌아 왔습니다.

이것은 몇 달 동안 잘 실행되었지만 최근에 log.Error () 문이 "System.InvalidOperationException :이 SqlTransaction이 완료되었습니다. 더 이상 사용할 수 없습니다."예외를 기록한 다음 결코 기록하지 않는 몇 가지 인스턴스를 보았습니다.돌아온다.서비스는 며칠 동안 계속 실행될 수 있지만 더 이상 기록되지 않습니다.

읽을 때 Thread.Sleep이 이상적이지 않다는 것을 알고 있지만 왜 다시는 돌아 오지 않을까요?

도움이 되었습니까?

해결책

탐색하고 알아 보시겠습니까?그 개자식에게 디버거를 붙입니다!

최소한 다음과 같은 가능성이 있습니다.

  1. 로깅 시스템이 중단됩니다.
  2. 스레드가 정상적으로 종료되었지만 다른 부분에 논리 오류가 있기 때문에 서비스가 여전히 실행 중입니다.

    그리고 다음과 같은 경우가있을 수 있지만 거의 확실하지는 않습니다.

    • Sleep ()이 멈 춥니 다.

      그러나 어쨌든 디버거를 연결하면 스레드가 아직 있는지 여부와 실제로 중단되었는지 여부를 알 수 있습니다.

다른 팁

<인용구>

데이터베이스가 사라지고 몇 번 후에 Thread.Sleep을 넣고 데이터베이스 연결 오류로 가득 찬 3Gb 로그 파일로 돌아 왔습니다.

더 나은 옵션은 "이전 메시지가 N 번 반복되었습니다"와 같이 쓸 수 있도록 로깅 시스템이 중복을 트랩하도록 만드는 것입니다.

잠재적으로 큰 기능을 수행 한 방식으로 확장하는 대신 가능한 마지막 순간에 연결을 열고 최대한 빨리 연결을 닫아야하는 방법에 대한 표준 메모를 작성했다고 가정합니다. 데모 코드의 인공물이며 애플리케이션이 실제로 제대로 작성되었습니다.

설명한 오류를보고한다는 것은 이 핸들러 가 오류를보고한다는 의미입니까? 저에게 명확하지 않은 이유는 코드 스 니펫에서 "문제가 발생했습니다"라고 말했지만 설명에는 그렇게 말하지 않았기 때문입니다. 예외가 다른 곳에서 잡히고 코드가 수면 이외의 다른 곳에서 멈춰 있기 때문에 이것이 너무 어리석은 일이되기를 원하지 않습니다.

정확히 같은 문제가있었습니다.Sleep 라인을 예외 처리기 외부로 이동하면 다음과 같이 문제가 해결되었습니다. 라코 디스

중단 스레드는 예외 처리기의 컨텍스트에서 작동하지 않는 것 같습니다.

게시 한 코드에서 예외가 발생한 후 시스템을 다시 시작할 수 있는지 확실하지 않습니다.doStuff ()에서 예외가 발생하면 제어 흐름은 closeConnection ()을 통과하지 않고 openConnection ()으로 다시 전달됩니다 (10 분 대기 후).

그러나 다른 사람들이 말했듯이 디버거를 연결하고 실제 위치를 찾으십시오.

Thread.Sleep (10 * 60 * 1000) 사용해보기

나는 무슨 일이 일어나고 있는지 완전히 파악하지 못했지만, 10 분 휴면 중에 발생하는 ThreadInterruptedExceptions와 관련이있는 것 같아서 다음과 같이 코드를 변경했습니다. 라코 디스

ThreadInterruptedException을 구체적으로 포착하는 것 외에도 try 블록 내에서 모든 절전 모드가 발생하므로 더 안전하다고 느껴지므로 예기치 않은 일이 발생하면 기록됩니다.더 많은 정보를 찾으면이 답변을 업데이트하겠습니다.

내 자신의 Thread.Sleep 문제를 찾는 동안이 문제를 발견했습니다.이것은 관련이있을 수도 있고 아닐 수도 있지만 doSomething ()에서 예외가 발생하면 closeDatabaseConnections ()가 발생하지 않아 리소스 누수가 발생할 가능성이 있습니다. 저는 finally 블록에 넣습니다.생각해 볼만한 것이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top