usr이 내 질문에 명확하지 않다는 것을 지적한 후 "다른 스레드"에 관한 자세한 내용은 내 질문을 편집하십시오.다른 클래스에 걸쳐 ThreadLocal <T>을 사용하여 데이터를 전달하십시오.
다른 클래스에 걸쳐 ThreadLocal<T>
을 사용하여 데이터를 전달하려면 어떻게해야합니까?
기본적으로 웹 서비스의 클래스에서 LogContext 정보를 TraceExtension:SoapExtension
클래스 (이 TraceExtension은이 WebService가 호출하는 다른 WebService의 요청/응답을 기록하는 것입니다)로 전달해야합니다.
기능이 다른 스레드에서 실행되고 요청을 시작한 스레드가 아니기 때문에 일반적으로 그런 용도로 사용하는 ServiceContext:IExtension <InstanceContext>
에서 가져올 수 없습니다.
나는 Thread.GetNamedDataSlot()
방법을 사용하여 작동하지만, 성능 테스트에서 메모리 누수 문제가 있음을 발견했습니다. (예, Thread.FreeNamedDataSlot()
라고 부르며 문제가 지속됩니다.) 이로 인해 MS 게시판 http://support.microsoft.com/kb/2540745에 누출 문제가있을 수 있지만 현재의 릴리스 시간에는 모든 프로덕션 서버에 수정 프로그램을 배포 할 수 없습니다. 해결 방법은 System.Threading.ThreadLocal 클래스를 사용하는 것입니다.
내가 지금까지 발견 한 모든 리소스/예제에는 동일한 클래스와 병렬 처리 및 PLinq의 ThreadLocal 인스턴스가 있습니다. 한 클래스의 데이터를 초기화/설정하고 다른 클래스에서 데이터를 가져 오는 예제는 매우 유용합니다. TraceExtension : SoapExtension
에 데이터를 전달하는 다른 방법도 마찬가지로 유용합니다.
일정이 다소 어려워서 도움이 될 것입니다. 더 많은 정보와
편집 :
요청이 필요한 응답을 반환하는 동안, 우리는 몇 가지 배경 처리를 실행하는 새로운 스레드를 생성 오는 우리를 Webservice의 스레드. 새 스레드는 다른 백엔드 웹 서비스에 대한 호출을 호출합니다. 백엔드 웹 서비스에 대한 요청/응답을 추적하는 TraceExtension 클래스도 있습니다. 원본 스레드의 LogContext 정보를 ContextInfo : ISynchronizeInvoke
을 사용하여 새 스레드의 메서드로 전달합니다.
문제는 LogContext 객체를 가져 오는 중입니다. 백엔드 웹 서비스 호출을 호출하는 클래스에서 TraceExtension 클래스 (클라이언트 요청이 들어온 원래 스레드가 아니고 새 스레드에서 실행되는)에 LogContext를 보유하는 ServiceContext:IExtension<InstanceContext>
이 있습니다.
"기능이 다른 스레드에서 실행되고 요청을 시작한 스레드가 아니기 때문에 스레드간에 데이터를 전달해야하므로 스레드 로컬 상태를 사용할 수 없습니다. 내가 뭘 놓치고 있니? – usr
새 스레드가 만들어지면 컨텍스트 정보를 사용하여 컨텍스트 정보를 전달합니다. ISynchronizeInvoke. 그래서 새로운 스레드에서 LogContext를 받지만 나중에이 새 스레드에서 백엔드 WebService로 호출하면 LogContext를 TraceExtension 클래스에 전달하여 백엔드 웹 서비스를 추적 할 수 없었습니다. "다른"스레드에서 다른 작업에 대한 백그라운드 처리를 수행하지 않기 때문에 ServiceContext에서 LogContext를 얻을 수 있습니다. IExtension. 그러나이 경우에는 일어나지 않았습니다. 그리고 그것은 제가 실제로 "다른 스레드에서 실행됩니다"라는 의미입니다. –