dangerousThreadingAPI MDA
참고 항목
이 문서는 .NET Framework와 관련이 있습니다. .NET 6 이상 버전을 포함하여 .NET의 최신 구현에는 적용되지 않습니다.
dangerousThreadingAPI
MDA(관리 디버깅 도우미)는 Thread.Suspend 메서드가 현재 스레드 이외의 스레드에서 호출될 때 활성화됩니다.
증상
애플리케이션이 응답하지 않습니다. 시스템 또는 애플리케이션 데이터가 일시적으로 또는 애플리케이션이 종료된 후에도 예측 가능한 상태로 남아 있을 수 있습니다. 일부 작업이 예상대로 완료되지 않습니다.
문제에 상속되는 임의성으로 인해 증상이 크게 달라질 수 있습니다.
원인
스레드는 Suspend 메서드를 사용하는 다른 스레드에 의해 비동기적으로 일시 중단됩니다. 작업 중간에 있을 수 있는 다른 스레드를 언제 안전하게 일시 중단할 수 있는지 확인할 방법이 없습니다. 스레드를 일시 중단하면 데이터가 손상되거나 고정이 중단될 수 있습니다. 스레드가 일시 중단 상태로 전환되고 Resume 메서드를 통해 다시 시작되지 않으면 애플리케이션이 응답을 중지하고 애플리케이션 데이터가 손상될 수 있습니다. 이러한 메서드는 사용되지 않는 것으로 표시되었습니다.
동기화 기본 형식이 대상 스레드에서 보류되는 경우 일시 중단 중에 계속 보류됩니다. 기본 형식에 대한 잠금을 획득하려는 시도인 Suspend를 수행하는 스레드 같은 또 다른 스레드인 경우 이로 인해 교착 상태가 발생할 수 있습니다. 이 상황에서는 문제가 교착 상태로 나타납니다.
해결
Suspend 및 Resume을 사용해야 하는 디자인을 피합니다. 스레드 간의 협력을 위해 , , 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();
}
참고 항목
.NET