이벤트 로그와 다중 스레드 구성 요소
업데이트: 2007년 11월
이벤트 로그는 응용 프로그램을 실행할 때 중요한 이벤트를 추적하기 위해 사용합니다. 이벤트 로그를 사용하면 성능 분석이나 문제 해결에 유용한 정보를 기록할 수 있습니다. 다중 스레드 구성 요소에서 이벤트를 기록할 때 추가로 고려할 사항이 있습니다. 첫째, 메시지를 기록하는 스레드의 ID를 기록하는 메커니즘이 있어야 합니다. 둘째로는 이벤트 로그와 상호 작용할 때 스레드로부터의 안전성을 고려해야 합니다. 경합 상태를 피하기 위해서는 메시지를 작성하려는 스레드에서 로그에 대한 단독 잠금을 얻어야 합니다. 이벤트 로그의 개요에 대해서는 이벤트 로그 관리를 참조하십시오. 스레드로부터의 안전성에 대한 자세한 내용은 스레드로부터 안전한 구성 요소를 참조하십시오.
각 스레드를 식별하려면 Thread.Name 속성을 설정해야 합니다. String 값을 받은 다음 역시 String 값을 반환하는 이 속성은 각 스레드에 대한 고유 식별자를 설정하는 데 사용할 수 있습니다. 그런 다음 이 값을 EventLog.CreateEventSource 메서드에 전달하여 해당 스레드를 각 스레드의 이벤트 소스로 지정할 수 있습니다. 이벤트를 기록할 때 스레드에서 이벤트 로그의 Source 속성을 이벤트 이름으로 설정하여 이벤트가 정확하게 기록되도록 할 수 있습니다.
다중 스레드 환경에서 여러 줄의 코드를 실행할 때는 코드를 실행하기 전에 스레드에서 이벤트 로그에 대한 단독 잠금을 얻어야 합니다. 예를 들어, 다중 스레드 환경에서 실행되는 아래와 같은 코드가 있습니다.
MyEventLog.Source = Threading.Thread.CurrentThread.Name.ToString
EventLog.WriteEntry("What thread did this come from?", "myApplication")
MyEventLog.Source = System.Threading.Thread.CurrentThread.Name.ToString();
EventLog.WriteEntry("What thread did this come from?", "myApplication");
여러 스레드에서 이 줄을 동시에 실행하고 있는 경우, 한 스레드에서 이벤트 로그의 EventLog.Source 속성을 변경하고 속성이 변경되고 나서 다른 스레드에서 메시지를 작성할 수도 있습니다. 이러한 상황이 발생하지 않게 하려면 여러 스레드에서 코드를 실행하기 전에 개체에 단독 잠금을 설정할 수 있도록 SyncLock 문(Visual Basic) 또는 lock(C#) 문을 사용합니다. 잠금을 사용하여 앞서의 예제를 다음과 같이 변경할 수 있습니다.
SyncLock MyEventLog
MyEventLog.Source = System.Threading.Thread.CurrentThread.Name.ToString
EventLog.WriteEntry("What thread did this come from?", "myApplication")
End SyncLock
lock(MyEventLog)
{
MyEventLog.Source = Threading.Thread.CurrentThread.Name.ToString();
EventLog.WriteEntry("What thread did this come from?",
"myApplication");
}
Debug 및 Trace 클래스를 사용하여 다중 스레드 응용 프로그램에서 발생하는 이벤트를 기록할 수도 있습니다. 이러한 클래스는 출력 창, 콘솔 창, 텍스트 파일이나 이벤트 로그 또는 기타 다양한 개체로 출력을 보낼 수 있는 정적 클래스입니다. 자세한 내용은 Visual Basic 및 Visual C#에서 응용 프로그램 추적 및 계측을 참조하십시오.