[c#] C # 스레드 종료 및 Thread.Abort ()

MSDN에서 Thread.Abort () 메서드에 대한 설명은 “이 메서드를 호출하면 일반적으로 스레드가 종료됩니다.”라고되어 있습니다.

왜 항상 그렇지 않습니까?

어떤 경우에 스레드를 종료하지 않습니까?

스레드를 종료 할 다른 가능성이 있습니까?



답변

Thread.Abort()ThreadAbortException스레드에를 주입합니다 . 스레드는를 호출하여 요청을 취소 할 수 있습니다 Thread.ResetAbort(). 또한 finally예외가 처리되기 전에 실행 되는 블록 과 같은 특정 코드 부분 이 있습니다. 어떤 이유로 스레드가 이러한 블록에 갇혀 있으면 스레드에서 예외가 발생하지 않습니다.

호출자는를 호출 할 때 스레드의 상태를 거의 제어 Abort()할 수 없으므로 일반적으로 그렇게하는 것은 바람직하지 않습니다. 대신 종료를 요청하는 메시지를 스레드에 전달하십시오.


답변

어떤 경우에 스레드를 종료하지 않습니까?

이 질문은 중복됩니다.

Thread.Abort () 사용시 문제점

스레드를 종료 할 수있는 다른 가능성이 있습니까?

예. 문제는 정중하게 중지하라고 말할 수없는 스레드를 시작해서는 안되며 적시에 중지된다는 것입니다. (1) 중지하기 어렵거나, (2) 버그가 있거나, 최악의 경우 (3) 사용자에게 적대적 일 수있는 스레드를 시작해야하는 상황에 있다면 올바른 방법은 다음과 같습니다. 새 프로세스를 만들고 새 프로세스에서 스레드를 시작한 다음 스레드가 중단 되기를 원할 때 프로세스종료합니다 . 비협조적인 스레드의 안전한 종료를 보장 할 수있는 유일한 방법은 운영 체제가 전체 프로세스를 중단하는 것입니다.

자세한 내용은이 질문에 대한 지나치게 긴 답변을 참조하십시오.

C #의 루프 내에서 잠금 문 사용

관련 비트는 스레드를 중단하기 전에 스레드가 스스로를 죽일 때까지 기다려야하는 시간과 관련하여 고려 사항이 무엇인지 논의하는 끝에있는 비트입니다.


답변

왜 항상 그렇지 않습니까? 어떤 경우에 스레드를 종료하지 않습니까?

우선, 스레드는 ThreadAbortException자신의 종료를 포착 하고 취소 할 수 있습니다 . 또는 중단을 시도하는 동안 영원히 걸리는 계산을 수행 할 수 있습니다. 이 때문에 런타임은 사용자가 요청한 후에 스레드가 항상 종료된다는 것을 보장 할 수 없습니다.

ThreadAbortException 더 있습니다 :

스레드를 제거하기 위해 Abort 메서드를 호출하면 공용 언어 런타임에서 ThreadAbortException이 발생합니다. ThreadAbortException은 catch 할 수있는 특수 예외이지만 catch 블록의 끝에서 자동으로 다시 발생합니다. 이 예외가 발생하면 런타임은 스레드를 종료하기 전에 모든 finally 블록을 실행합니다. 스레드는 finally 블록에서 제한되지 않은 계산을 수행하거나 Thread.ResetAbort()중단을 취소하는 호출 을 수행 할 수 있으므로 스레드가 끝날 것이라는 보장은 없습니다.

Abort()수동으로 스레드 할 필요가 없습니다 . 스레드의 메서드가 반환되도록하면 CLR이 모든 더러운 작업을 수행합니다. 스레드가 정상적으로 종료됩니다.


답변

FileStream.Read()현재 아무것도 수신하지 않는 명명 된 파이프 (수신 데이터를 기다리는 동안 호출 블록 읽기)는에 응답하지 않습니다 Thread.Abort(). Read()통화 내에 남아 있습니다 .


답변

스레드가 잠금을 유지하고 중단 / 종료되면 어떻게됩니까? 리소스가 고정 된 상태로 유지

스레드가 다른 스레드가 아닌 자체 중단을 호출 할 때 제대로 작동합니다. 중단, 작업을 완료하지 않은 경우에도 영향을받는 스레드를 강제 종료하고 리소스를 정리할 기회를 제공하지 않습니다.

MSDN 참조


참조 : 관리 형 스레딩 모범 사례


답변

루프에 갇힌 스레드를 중단 할 수없는 것 같습니다.

//immortal
Thread th1 = new Thread(() => { while (true) {}});

그러나 루프 중에 잠 자면 스레드를 중단 할 수 있습니다.

//mortal
Thread th2 = new Thread(() => { while (true) { Thread.Sleep(1000); }});


답변

ThreadAborts는 finally 블록 내부 또는 BeginCriticalRegionEndCriticalRegion 사이에 발생하지 않습니다.