2009-04-07 1 views
2

IIS가 스레드에서 정적 변수를 처리하는 방법을 이해하는데 약간의 문제가 있습니다. IIS가 4 개의 요청을 동시에 처리 할 수 ​​있고 4 개의 개별 스레드가 웹 사이트를 실행하는 것과 동일한 4 개의 작업자 프로세스가있는 경우 필자는 항상 이해하고 있습니다. 모든 정적 변수는 각 개별 스레드에서 지속됩니다. 내가 혼란스러워하는 이유는 연결 및 캐싱 트랜잭션을 관리하는 범위를 가지고 있기 때문입니다. 내가 응용 프로그램을 테스트 할 때 나는 어떤 이슈도 알아 차리지 못한다. 그러나 그것을 컴파일하고 두 개의 다른 위치에서 동시에 충돌 한 후에 나는 일종의 갈등을 일으키는 것 같다. 이제 이러한 작업자 프로세스가 분리되어 있다면 왜 이것이 될까요? 한 번에 하나의 작업 스레드에서 둘 이상의 요청을 처리 할 수 ​​있습니까? 이러한 기능을 관리하는 개체의 에스컬레이션을 처리하기 위해 이러한 정적 멤버에 보유 된 고유 ID가 있으며 동일한 개체에 액세스하려고 시도하는 것처럼 보입니다.정적 멤버 변수가 IIS에서 한 번에 둘 이상의 요청에 의해 액세스되는 것을 방지하려면 어떻게합니까?

저는 x64 시스템의 Vista의 IIS 서버에서 실행하고 있습니다.

하나의 요청에 스레드를 유지해야하는 값을 편집

, 나는 트릭을 할 것으로 보인다 Web.HttpContext.Current.Items으로이 값을 넣습니다.

<ThreadStatic()>을 사용할 수는 있지만 요청 프로세스가 진행되는 동안 제공되지 않을 수 있습니다. 내가 가지고있는 하나의 모듈에서, 변수가 이미 그 스레드가 cahcing 서버에 대한 설정을로드했는지를 나타낼 때만 사용됩니다. true이면 tread (asp.net 아님)가 캐싱 서버에서 데이터를 가져올 준비가되었습니다.

답변

7

변경 사항 : ASP.NET을 사용하는 경우 IIS 스레드가 아닌 ASP.NET 스레드입니다.

둘째,이 문제는 .NET 문제입니다. static 변수는 .NET의 AppDomain에서 공유됩니다. IIS 응용 프로그램 당 하나의 AppDomain을 갖기 때문에 (즉, 다소) 정적 변수가 응용 프로그램의 모든 작업자 스레드에서 공유됨을 의미합니다.

4 개 이상의 스레드가 있으며 모두 동일한 변수를 공유하므로 잠금을 수행해야하거나 정적 변수를 사용하지 않아도됩니다.

언제나 당신의 이해가 무엇이든, 나는 여러분이 돌아가서 그 이해를 얻은 곳을 알아내는 것이 좋습니다. ASP.NET과 관련이 없으므로 업데이트하십시오.


편집 : 제목이 변경, 그래서 내가 대답을 약간 변경할 수 있습니다.

이러한 변수에 대한 액세스를 연동시켜야합니다. 또는 디자인을 재평가 해보십시오. 당신의 디자인은 통계에 접근하기위한 다른 모델을 떠올리게했습니다. 이 가정은 옳지 않은 것으로 판명되었습니다. 이 가정이 설계 전반에 걸친 연속 일 수도 있습니다. 현실에 비추어 디자인을 재평가해야합니다.

+0

트랜잭션 범위가 asp.net에서이 문제를 처리하는 방법을 알고 있습니까? – Middletone

+0

트랜잭션 범위는 관련이 없습니다. –

+0

개체는 트랜잭션 범위의 동작을 모방하기 위해 만들어 지므로 DB 트랜잭션 격리 대신 다른 개체를 처리합니다. – Middletone

0

각 작업자 프로세스는 자체 AppDomain에서 실행되므로 각 WP에는 자체 정적 변수 인스턴스가 있습니다.

여기에 나와있는 대답에서 AppDomain은 틀린 WP 사이에서 공유됩니다.

.NET 연결 풀링을 사용해야하며 연결 ​​범위를 지정하는 (IDisposable) {} 방법을 조사해야합니다.

관련 문제