2008-10-06 4 views
7

스레드 로컬 저장소를 사용하여 충족시킬 수 있다고 생각되는 응용 프로그램의 요구 사항이 있지만이를 피하는 것이 가장 바람직하지 않은지 궁금합니다..NET에서 스레드 로컬 저장소를 사용하는 가장 좋은 방법은 무엇입니까?

나는이 주제에 대한 몇 가지 기사를 읽고 :

http://www.dotnetcoders.com/web/Articles/ShowArticle.aspx?article=58

http://msdn.microsoft.com/en-us/library/system.threadstaticattribute(vs.80).aspx

나는 그것을 사용하는 방법 을 알고 난 사용하는 경우는, 난 그냥 궁금 해서요.

알고 계시겠습니까?

[편집]

여기에 사용 사례입니다 :

나는 각 쿼리에 대한 로깅을 많이 할 몇 가지 방법을 통해 모든 데이터 액세스를 깔때기. 필자가 기록한 한 가지는 커맨드 텍스트가 가득 찬 덤프 명령으로, 추적 로그에서 Sql Management Studio로 직접 복사 - 붙여 넣기를 할 수 있습니다.

내 웹 응용 프로그램의 global.asax에서 처리되지 않은 예외가 발생할 때 최대한 많은 정보를 관리자에게 전자 메일로 보냅니다. SqlException을 얻을 때 SQL 명령 덤프 텍스트를이 전자 메일에 넣으므로 쿼리로 인해 페이지가 폭파 될 때 추적 로그를 파고 드는 시간을 절약 할 수 있습니다.

내 데이터 액세스 클래스의 메서드 시그니처를 변경하지 않고 일부 참조를 스택 아래로 전달할 수 있습니다. 예외가 발생하면이를 가져옵니다. 나는 TLS가 "lastsqlcommand"와 같은 것을 넣을 수있는 좋은 장소가 될지도 모른다고 생각했지만 실행 가능한 솔루션처럼 보이지 않습니다.

+0

나는 항상 스레드 로컬 저장소를 사용하지 않았으며 동일한 작업을 수행하는 또 다른 방법을 발견했습니다. 내 생각은 항상 스레드 로컬 저장소 아마도 직접 액세스 (아마도 이것이 옳은지 확실하지 않다)보다 느립니다. 다른 사람들이 생각하는 것이 궁금 할 것입니다. – dongola7

답변

7

asp.net 응용 프로그램의 경우 : 단일 요청을 처리하면 스레드가 전환 될 수 있습니다. 즉, 동일한 세션에 병렬 요청이있는 경우입니다. 이 때문에 다른 스레드에 있기 때문에 HttpApplication.PostRequireRequestState 이벤트가 발생하기 전에 TLS에 넣은 내용이 나중에 없을 수도 있습니다.

[아스 커에 의해 편집] 내 특정 유스 케이스에 대한

는, 나는 예외 세부 사항을 로그인 할 때 그때 검색하려면 SqlException.Data 사전에 키 - 값 쌍을 추가 끝났다. 이것은 내가 스레드 로컬 저장소를 사용하고자하는 기능을 제공합니다.

+0

이것은 정확히 내가 찾고있는 것입니다. 나는 그것이이 시나리오에서 신뢰할 수 없을 것이라고 생각했다. 고마워. –

+0

이것은 이전 답변이지만 조금 명확히하기 위해 ASP.NET은 매우 특정한 시나리오에서 스레드를 전환합니다. 가장 큰 방법은 비동기 IO 방법을 사용하는 것입니다. Lhotka와 Guthrie의 토론 : http://www.lhotka.net/WeBlog/PermaLink,guid,019e3c37-38ed-492e-b769-16e1a57fed0a.aspx – EBarr

6

스레드 로컬 저장소는 스레드 전에 디자인 된 라이브러리를 수정하고 많은 전역 변수와 통계를 사용하는 빠른 방법입니다. C 표준 라이브러리가 인터페이스를 변경하지 않고 스레드로부터 안전 해지는 방식입니다 (내부적으로 많은 함수가 정적 버퍼를 사용합니다).

일반적으로 이러한 목적에는 적합합니다. 다중 스레드 환경에서 전역 데이터를 가져야하는 경우 스레드 로컬 저장소를 사용하는 것이 좋습니다. 일반적인 이유는 동일한 스택 프레임에서 다시 호출하는 타사 함수를 호출하는 것이지만 추가 정보를 전달할 수있는 기회를주지는 않습니다. 예를 들어 이전 C 라이브러리를 .그물.

0

예를 들어 새로운 .net 4 ThreadLocal<T> 클래스를 살펴보십시오. 자세한 정보는 here입니다.

관련 문제