2009-12-15 4 views
2

msdn : "이 형식의 공용 static (Visual Basic의 경우 Shared) 멤버는 스레드로부터 안전합니다. 모든 인스턴스 멤버는 스레드로부터 안전하지 않을 수 있습니다." 인스턴스 메소드 만 포함합니다.C# Multithreaded 응용 프로그램의 TraceSource 클래스

모든 활동이 TextWriterTraceListener에 의해 레코더를 텍스트 파일로 가져 오는 방식으로 어떻게 사용해야합니까? 모든 스레드가 (호출하여) TraceEvent 메소드를 사용하는 정적 멤버입니다.

(나는이 질문을 일종의 how to instantiate C# TraceSources to log (multithreaded) ASP.NET 2.0 Web application (asmx ws)?에 묻었지만, 누군가 문서에 대해서도 괜찮다고 말하면 나는 믿을 수 없다.) 스레드 안전하지 않은 자원을 사용 (또는 스레드 안전이 보장되지 않음) 멀티 스레드 응용 프로그램의 경우

답변

0

나는 잠금 키워드에게 대한

lock(_lockObject) 
{ 
    // do my non-thread-safe-operations here 
} 

문서/예제를 사용합니다 잠금 키워드는 여기에서 찾을 수 있습니다 : 클래스의 공통의 정적 인스턴스를 사용하는 모든 스레드로

http://msdn.microsoft.com/en-us/library/c5kehkcz(VS.71).aspx

- 즉 반드시 스레드로부터 안전하지 않습니다. 정적 인스턴스를 사용하면 객체 상태가 스레드간에 공유/일관성을 유지하지만 반드시 메소드에 대한 병렬 호출을 방지하지는 않습니다. 사실, 인스턴스 메소드가 정적 객체 내에서 몇 가지 일반적인 상태 변수를 사용하는 경우 - 여러 스레드에서 객체에 액세스하면 경쟁 조건, 동일한 리소스에 액세스하려고 시도하는 여러 스레드 등 추가 문제가 발생할 수 있습니다. 개체가 이러한 조건을 방지하지 못합니다.

개체의 정적 인스턴스를 사용하는 경우 개체를 조작 할 때 개체 주위에 자물쇠를 넣으십시오. 그래야합니다.

+0

예 또는 모니터 클래스. 하지만 mysql 질문 : TraceSource의 정적 인스턴스를 하나 가지고 TraceEnvent 메서드를 사용하는 것이 안전할까요? http://social.msdn.microsoft.com/forums/en-US/netfxbcl/thread/93696038-2255-4d7c-a53a-b0b1bcdd2fc2를 참조하십시오. –

+0

알겠습니다. 나는 내 대답을 더 자세히 설명했다. 희망이 도움이됩니다. –

+0

TraceSource의 경우 TraceListener가 스레드로부터 안전하지 않기 때문에 'thread-unsafeness'가 원인 일 수 있습니다. 이것이 TraceInternal.UseGlobalLock이있는 이유입니다. 내가 알고 싶은 건 : TraceListener.IsThreadSafe가 TextWriterTraceListener가이 전역 잠금만큼 false를 반환한다면? 성능상의 이유로 이중 잠금을 원하지 않습니다. 예를 들어 http://www.grimes.demon.co.uk/workshops/InstrWSThree.htm을 참조하십시오. –

관련 문제