2009-05-08 2 views
0

System.Transactions.TransactionScope을 사용하는 코드가 있는데 트랜잭션 범위의 새 인스턴스를 만들면 프로그램이 중지됩니다.백그라운드 스레드의 새로운 System.Transactions.TransactionScope()는 프로그램을 중단합니다

예외 또는 메시지가 없으면 프로그램이 중지되고 Visual Studio에서 코드 편집 모드로 돌아갑니다. 프로세스가 완전히 사라졌습니다. 이벤트 표시기에는 예외, 메시지 또는 이벤트가 없습니다.

문제점이있는 TransactionScope를 사용하는 다른 테스트 응용 프로그램이 있으므로 환경 문제가되어서는 안됩니다.

나는 예외 세부 사항을 얻는 방법을 모른다. Visual Studio 내에서 Debug-> Exceptions 대화 상자의 모든 "throw 된"체크 상자를 켜 놓았습니다. 예외가 발생했을 때 VS가 자동으로 중단 되길 바랬지 만 그렇지 않습니다.

누구든지 프로그램 종료 이유를 알 수 있습니까?

편집 : 방금 ​​새로운 것을 발견했습니다. TransactionScope는 ThreadPool.QueueUserWorkItem을 통해 백그라운드 스레드에서 실행되는 메소드에서 작성됩니다. 방금 주 응용 프로그램 스레드에서 직접 메서드를 호출하면이 문제가 해결됩니다. 그래서 지금 내 질문은 "threadpool 스레드에서 TransactionScope를 사용하여 문제가 무엇입니까?"입니다. 새로운 스레드를 호출하기 전에 이고 트랜잭션 범위가 이 아니기 전에이 스레드 풀 스레드에서 실행되는 하나의 메소드 내에 있습니다.

답변

2

문제점을 발견했습니다. 그것은 내 컴퓨터를 조작하는 삐걱 거리는 유기적 구성 요소였습니다.

ThreadPool.QueueUserWorkItem() 스레드 풀 스레드에서 작업을 시작합니다. background thread을 의미합니다. 코드는 테스트 콘솔 응용 프로그램에서 실행되었고, 물론 ThreadPool.QueueUserWorkItem()을 호출 한 후 프로그램을 종료 시키려면 Main()에 무엇이든 넣는 것을 잊었습니다. 이것은 F10을 눌러 다음 줄로 넘어갈 때까지 프로그램이 실제로 멈추었 기 때문에 디버거가 스스로 닫 혔음을 의미합니다.

내가 수정 한 것은 Program.Main()의 끝에 Console.ReadKey()에 대한 전화를 추가하고 이제는 모두 아름답게 작동합니다. 문제는 System.Transactions.TransactionScope 또는 스레드 풀 스레드와 아무 관련이 없습니다. 어떤 중단 선을 썼는지 상관없이 일어 났을 것입니다.

:
당신이 그때 그렇게하지 않은 이유를 지적 할 것이다 위의 링크 된 기사를 읽고하는 ThreadAbortException을 봤어야 생각합니다.

프로세스가 아래로 을 종료되기 때문에 런타임 배경 스레드를 중지

, 예외가 스레드에서 발생되지 : 여기에 직접 인용입니다. 그러나 AppDomain.Unload 메서드가 응용 프로그램 도메인을 언로드하므로 스레드가 인 경우 스레드에서 스레드 모두 ThreadAbortException이 Throw됩니다.

0

하나의 잘못된 추측 : Microsoft Distributed Transaction Coordinator 서비스 (MSDTC)가 중지 되었습니까? 예를 들어 Vista의 경우 기본적으로이 경우입니다. 그래도 예외가 발생할 것으로 예상되었으므로 그 행동을 왜 준수하는지 확신 할 수 없습니다.

+0

예, 나는 그것을 다시 확인합니다. 한 번에 한 스레드에 하나의 트랜잭션 스코프가 있기 때문에 DTC를 사용하지 않아야하며 TS는 테스트 응용 프로그램에서 정상적으로 작동합니다. 아직도 내가 틀릴 수있어서 내가 조사 할거야. 알림 주셔서 감사. –

+0

아니요, 불행히도 MSDTC를 시작하면 도움이되지 않았습니다. –

0

먼저 Windows 이벤트 로그의 내용은 무엇입니까?

아무 것도 없다면 Visual Studio에 디버거 (Visual Studio 자체 또는 NTSD (Debugging Tools for Windows 부분))를 연결하여 운이 좋을 수도 있습니다.

피어 코드 리뷰가 도움이 될 수도 있습니다 (눈의 두 번째 세트가 눈에 띄게 될 수도 있음). 또는 샷건 접근 방식을 시도하십시오. - TransactionScope를 사용하는 다른 앱이 왜이 앱이 실패하는지 알 때까지 체계적으로 코드를 제거하십시오.

관련 문제