ThreadAbortException은 여전히 ​​finally(try/catch) 섹션에서 코드 실행을 강제합니까?

StackOverflow https://stackoverflow.com/questions/6099382

문제

나는 System.Timers.Timer 타이머야 AutoReset 로 설정되어 있습니다 false.나는 try/finally 나에게 보험을 들다 Start 타이머가 마지막에 있어 callback (저는 타이머를 이런 식으로 사용합니다. callback 실행).암호:

// inside timer call back
try
{
    // Do something
}
finally
{
    timer.Start(); // Is this line always executed?
}

내 질문은 실행 스레드가 Aborted?는 finally 섹션이 여전히 실행 중이거나 해당 부분을 실행할 스레드가 없습니까?

도움이 되었습니까?

해결책

예, 해당 줄은 항상 실행되며 코드가 다음 위치에 있을 때까지 중단이 차단됩니다. finally 조항이 종료됩니다.

다른 팁

공식 출처는...

abort 방법으로 전화를 걸어 스레드를 파괴 할 때 공통 언어 런타임은 ThreadabortException을 던집니다.ThreadabortException은 잡을 수있는 특별한 예외이지만 캐치 블록 끝에서 자동으로 다시 올릴 것입니다.이 예외가 제기되면 런타임은 스레드를 끝내기 전에 모든 최종 블록을 실행합니다.스레드는 최종 블록에서 무한한 계산을 수행 할 수 있으므로 스레드를 호출 할 수 있으므로 중단을 취소하기 위해 ReseTabort는 스레드가 끝날 것이라는 보장이 없습니다.중단 된 스레드가 종료 될 때까지 기다리려면 Thread.join 메소드를 호출 할 수 있습니다.Join은 스레드가 실제로 실행을 멈출 때까지 반환되지 않는 차단 호출입니다.

자세한 내용은 다음에서 읽어보세요. MSDN.

말하다 선적 서류 비치 (강조 내) :

이 메서드가 스레드에서 호출되면 시스템은 스레드에서 ThreadAbortException을 발생시켜 이를 중단합니다.ThreadAbortException은 애플리케이션 코드에서 포착할 수 있는 특수 예외이지만 ResetAbort가 호출되지 않는 한 catch 블록의 끝에서 다시 발생합니다.ResetAbort는 중단 요청을 취소하고 ThreadAbortException으로 인해 스레드가 종료되는 것을 방지합니다. 실행되지 않은 finally 블록은 스레드가 중단되기 전에 실행됩니다.

스레드가 즉시 중단되거나 전혀 중단되지는 않습니다.이 상황은 스레드가 다음을 수행하는 경우 발생할 수 있습니다. 중단 절차의 일부로 호출되는 finally 블록의 계산 양은 무제한입니다., 이로 인해 중단이 무기한 지연됩니다.스레드가 중단될 때까지 기다리려면 Abort 메서드를 호출한 후 스레드에서 Join 메서드를 호출할 수 있지만 대기가 종료된다는 보장은 없습니다.

따라서 대답은 '예'입니다. finally 블록이 실행됩니다.

finally 어떻게 종료되든 항상 사용됩니다. try,

 Whereas catch is used to handle exceptions that occur in a statement block, 
 finally is used to guarantee a statement block of code executes regardless 
 of how the preceding try block is exited.

더 읽어보세요 MSDN.

스레드가 이미 중단된 경우 catch 블록과 finally 블록이 계속 실행될 수 있습니다.

system.threading 클래스에서 처리되는 방법에 대한 명확한 그림을 보려면 이 링크를 참조하십시오.ThreadAbortException의 깊이 연결

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