2010-02-01 3 views
4

파일을 분석하고 데이터베이스에 대한 트랜잭션 호출을하는 스레드가 있는데, 각 트랜잭션에는 트랜잭션의 일부로 감사 항목이 있습니다. Thread.Abort()를 호출하여 파일 처리를 중단하는 데 큰 문제가 있습니까? 어디서나 못생긴 안전한 곳을 분산시키는 것보다는?Thread Abort in .NET

파일은 중단 호출 후에 닫힙니다.

답변

10

분명한 문제는 트랜잭션을 포기하여 불확정 시간 (또는 시간 초과까지) 차단을 초래할 수있는 위험입니다. 하지만 당신은 모든 종류를 오프 혼란을 떠날 수 - 등 복구 할 수없는 Monitor 잠금 장치, 세마포어, 메모리 누수 등 한마디로

: 정확히을 을 알고하지 않는 스레드를 중단 할 것을 피하기 위해 힘껏 노력 무엇을 그것은 그 때하고 있습니다. 그리고 그것이 무엇을하는지 알 수있는 유일한 방법은 이미 알려진 "안전 지점"(귀하의 용어를 사용하는 경우)에있는 경우입니다 - 그래서 당신은 예외를 던지거나 무언가를 던져 관리 방식으로 스스로를 제기 할 수도 있습니다 .

+0

트랜잭션이 실행중인 세션이 폐쇄 될 것이며, 스레드가 실행 된 클래스에 배치 될 것이다. 서버가 트랜잭션을 롤백 할 것이고 클래스가 취소 기능에서 올바르게 닫힐 수 있음을 의미합니다. 어떤 잠금 장치, 세마포어 등이 손실됩니까? – Will

+0

@Will : 정리가 실행되는 동안 중단이 발생할 수 있습니다. 그게 당신의 정리가 끝나지 않을 수도 있다는 것을 의미합니다 *. 또한 Abort는 잠금 선언문을 방해 할 수 있습니다 (몇 가지 보호 책이 있지만 보장하지는 않습니다). 그래서 다시 자물쇠를 채울 수 있습니다. – Ruben

+0

@Ruben : Thread abort가 클린업 로직을 방해하지 않습니다 : "CER (Constrained Execution Region) 내에서 실행 중이거나 마지막으로 블록, catch 블록, .cctor 또는 비 관리 코드 내에서 실행중인 경우 스레드 중단을 처리하지 않습니다. 이러한 영역 중 하나에서 중단이 요청되면 종료 할 때 즉시 처리합니다 (다른 영역 내부에 중첩되어 있지 않다고 가정). 조 더피. –

8

모범 사례 : 프로세스를 분해 할 때만 스레드를 중단하십시오.

+0

AppDomanain도 마찬가지입니까? –

0

스레드가 대기 상태를 종료하도록하려면 Thread.Interrupt()를 시도하십시오.

MSDN page