2012-10-09 2 views
2

.net 추적을 처음 사용합니다.TraceSource.Trace 메서드는 모든 리스너가 처리 할 때까지 호출 스레드를 차단합니까?

내 응용 프로그램에는 거의 10-15 개의 추적 소스가 있고 공유 리스너 목록에는 텍스트 파일 수신기와 SQL 서버 수신기가 있습니다. 나는 그것이 텍스트 파일 리스너 및 SQL Server 리스너에 의해 추적/처리 될 때까지

traceSource.TraceInformation("Sample information") 

다음 호출 스레드가 차단됩니다 호출하면 내 질문입니다. 또는 TraceSource는 내부적으로 로깅을위한 대기열을 포함하므로 호출 스레드가 즉시 해제되고 로깅이 백그라운드 스레드에서 수행됩니다.

기본적으로 모든 추적 수신기에서 기록 될 때까지 호출 스레드를 차단하고 싶지 않습니다. 그런 식으로 구현하고 싶다면 사용자 정의 리스너를 사용해야합니까?

답변

0

추적은 청취자와 마찬가지로 다중 스레드 안전합니다. 많은 스레드가 추적을 통해 동일한 파일에 쓰려고 시도하는 경우, 경합이있을 수 있으며, 일부 리스너는 현재 로그 파일이 이미 열려 있으면 다른 로그 파일에 기록합니다. 경험에 따라 콘솔 추적 수신기에 쓰는 것은 때때로 두 개의 스레드가 콘솔에 동시에 쓰려고 시도 할 때 텍스트가 인터리브된다는 것을 안다. 이것은 System.Diagnostics 프레임 워크 코드에서 차단을 강요하지 않는다는 것을 의미합니다.

저속 청취자 블록을 테스트하려면 사용자 지정 청취자를 구현하여 경험적으로 확인할 수 있습니다. this base class을 권장하므로 사용자 지정 청취자를 작성하는 데 두 가지 방법 만 우선 적용하면됩니다. Thread.Sleep (6000)을 추가하고 모든 스레드가 차단되는지 확인합니다.

그렇다면 추적 호출을 일종의 화재 및 잊어 버린 호출 (Task.Run, Task.StartNew 또는 새 스레드/시작)에 넣는 것이 좋습니다. 그러나 새 스레드를 만드는 오버 헤드가 몇 밀리 초 동안 블로킹하는 것보다 성능을 악화시킬 수 있다고 생각됩니다. Here is one related question.

관련 문제