2011-05-08 11 views
5

제목을 읽으면 Thread.Abort()가 실제로 중단되지 않습니다. 나는 많은 사람들이 위험한 명령을 내리고 결코 일할 것을 보장하지 않는다고 들었다. 그러나 실제적으로 그렇게 재현 할 수는 없었다. 항상 언제 Thread.Abort()가 실제로 중단되지 않습니까?

인가 .. 나를 위해 Thread.Abort()가 일관되게을 을 실패 할 수있는 특정 상황이 일이야?

답변

9

the documentation을 읽으셨습니까?

스레드가 즉시 중단되거나 전혀 중단되지 않을 수도 있습니다. 이 상황은 스레드가 abort 프로 시저의 일부로 호출되는 finally 블록에서 무제한의 계산을 수행하여 중단을 무기한 지연하면 발생할 수 있습니다. 스레드가 중단 될 때까지 대기하려면 Abort 메서드를 호출 한 후 스레드에서 Join 메서드를 호출 할 수 있지만 대기가 끝날 것이라고 보장 할 수는 없습니다. 시작이 호출 될 때 중단이 시작되지 않은 스레드에서 호출하는 경우

...

는 스레드가 중단됩니다. 차단되었거나 잠자기 상태 인 스레드에서 Abort가 호출되면 스레드가 인터럽트 된 다음 중단됩니다.

일시 중단 된 스레드에서 Abort가 호출되면 Abort를 호출 한 스레드에서 ThreadStateException이 발생하고 AbortRequested가 중단 될 스레드의 ThreadState 속성에 추가됩니다. Resume가 불려 갈 때까지, 중단 된 thread로 ThreadAbortException는 Throw되지 않습니다.

관리되지 않는 코드를 실행하는 동안 관리되는 스레드에서 Abort가 호출되면 스레드가 관리되는 코드로 반환 될 때까지 ThreadAbortException이 throw되지 않습니다.

두 호출이 동시에 중단되면 한 호출이 상태 정보를 설정하고 다른 호출이 중단을 실행할 수 있습니다. 그러나 응용 프로그램은이 상황을 감지 할 수 없습니다.

스레드에서 중단이 호출 된 후 스레드 상태에는 AbortRequested가 포함됩니다. Abort를 성공적으로 호출 한 결과로 스레드가 종료 된 후 스레드의 상태가 Stopped로 변경됩니다. 충분한 권한이 있으면 Abort의 대상인 스레드가 ResetAbort 메서드를 사용하여 중단을 취소 할 수 있습니다. ResetAbort 메서드를 호출하는 예제는 ThreadAbortException 클래스를 참조하십시오.

+1

감사합니다. 나는 대답을 위해 구글을했지만 검색 결과에서 문서를 찾지 못했을 것입니다. 아마도 미래에는 msdn을 더 자세히 조사 할 것입니다. – caesay

+0

는 그렇게 간단하게 검색하는 것을 생각하지 않았습니다. – caesay

+0

@ ta.speot.is 더 많은 upvotes가 없다는 것은 수치스러운 일입니다. Thread.Abort에 대한 최고의 답변입니다. :) – ipavlu

관련 문제