2014-11-20 4 views
2

Thread.Abort를 호출 할 때 finally 문이 실행되지 않는 이유를 아는 사람이 있습니까? 나는 다음과 같은 쓰레드 기능을 가지고있다.Thread.Abort를 호출 할 때 마침내 실행되지 않음

void ThreadFunc() 
{ 
    try 
    { 
     int counter = 0; 
     while (true) 
     { 
      Debug.Log ("Waiting" + counter); 
      Thread.Sleep(100); 
      ++counter; 
     } 
     Debug.Log("Success."); 
    } 
    catch(ThreadAbortException ex) 
    { 
     Debug.LogWarning("Cancelled: " + ex); 
    } 
    catch(System.Exception ex) 
    { 
     Debug.LogError("Error: " + ex); 
    } 
    finally 
    { 
     Debug.Log("Finally"); 
    } 
} 

Thread.Abort를 사용하여이 쓰레드를 종료한다. 출력에서 볼 수있는 것은 Waiting의 묶음이지만 다른 줄은 없습니다. 내 주 스레드는 Thread.Abort를 호출 한 후 계속 실행됩니다 (즉, 하위 스레드는 완료하는 데 충분한 시간이 있음). Debug.Log 함수는 스레드로부터 안전합니다.

Windows에서 발생합니다. 모노 (Unity 게임 엔진)을 사용하고 있습니다. Mac에서는 잘 작동합니다. iOS에서이 동작이 발생하지만 장치/iOS 버전 또는 XCode 버전 (아직 파악하지 못했습니다)에 의존하는 것으로 보입니다. Windows에서는 매번 발생합니다.

BTW : iOS에서 을 {{catch {} (으)로 보내면 충돌이 발생합니다.

왜 이런 일이 일어날 지 알고 있습니까? 그것은 Thread.Abort와 ThreadAbortException의 문서에서 말하는 것과는 상당히 다른 것 같다.

답변

2

모노는 Constrained Execution Regions을 지원하지 않으며 Thread.Abort가 호출 될 때 catch/finally를 완전히 지원하지 않습니다.

여기에 대해 bug이 있습니다.