다음을 통해 공유


dangerousThreadingAPI MDA

dangerousThreadingAPI MDA(관리 디버깅 도우미)는 Thread.Suspend 메서드가 현재 스레드 이외의 스레드에서 호출될 때 활성화됩니다.

증상

애플리케이션이 응답하지 않습니다. 시스템 또는 애플리케이션 데이터가 일시적으로 또는 애플리케이션이 종료된 후에도 예측 가능한 상태로 남아 있을 수 있습니다. 일부 작업이 예상대로 완료되지 않습니다.

문제에 상속되는 임의성으로 인해 증상이 크게 달라질 수 있습니다.

원인

스레드는 Suspend 메서드를 사용하는 다른 스레드에 의해 비동기적으로 일시 중단됩니다. 작업 중간에 있을 수 있는 다른 스레드를 언제 안전하게 일시 중단할 수 있는지 확인할 방법이 없습니다. 스레드를 일시 중단하면 데이터가 손상되거나 고정이 중단될 수 있습니다. 스레드가 일시 중단 상태로 전환되고 Resume 메서드를 통해 다시 시작되지 않으면 애플리케이션이 응답을 중지하고 애플리케이션 데이터가 손상될 수 있습니다. 이러한 메서드는 사용되지 않는 것으로 표시되었습니다.

동기화 기본 형식이 대상 스레드에서 보류되는 경우 일시 중단 중에 계속 보류됩니다. 기본 형식에 대한 잠금을 획득하려는 시도인 Suspend를 수행하는 스레드 같은 또 다른 스레드인 경우 이로 인해 교착 상태가 발생할 수 있습니다. 이 상황에서는 문제가 교착 상태로 나타납니다.

해결

SuspendResume을 사용해야 하는 디자인을 피합니다. 스레드 간의 협력을 위해 , , MutexMonitorReaderWriterLock또는 C# lock 문과 같은 Lock동기화 기본 형식을 사용합니다. 이러한 메서드를 사용해야 할 경우 스레드가 일시 중단 상태인 동안 실행되는 기간을 단축하거나 코드 양을 최소화합니다.

런타임에 대한 영향

이 MDA는 CLR에 아무런 영향을 미치지 않습니다. 위험한 스레딩 작업에 대한 데이터만 보고합니다.

출력

MDA는 MDA를 활성화시키는 위험한 스레딩 메서드를 식별합니다.

구성

<mdaConfig>  
  <assistants>  
    <dangerousThreadingAPI />  
  </assistants>  
</mdaConfig>  

예시

다음 코드 예제에서는 dangerousThreadingAPI를 활성화시키는 Suspend 메서드에 대한 호출을 보여 줍니다.

using System.Threading;  
void FireMda()  
{  
Thread t = new Thread(delegate() { Thread.Sleep(1000); });  
    t.Start();  
    // The following line activates the MDA.  
    t.Suspend();
    t.Resume();  
    t.Join();  
}  

참고 항목