할 수 있는 방법 readonly 정적 필드 null 이 될?
-
19-09-2019 - |
문제
그래서 여기에서 발췌한 하나의 클래스:
[ThreadStatic]
readonly static private AccountManager _instance = new AccountManager();
private AccountManager()
{
}
static public AccountManager Instance
{
get { return _instance; }
}
당신이 볼 수있는,그것의 단일-per-thread-즉인스턴스가 표시 ThreadStatic 특성이 있습니다.인스턴스는 또한 인스턴스의 일부분으로 정적 건축.
그래서 되는 경우,어떻게 가능하려 든에 나 ASP.NET MVC 응용 프로그램을 사용하려고 할 때 인스턴스설턴트를 제공합니다.
해결책
인용 MSDN ThreadStaticAttribute:
클래스 생성자가 실행될 때 이러한 초기화는 한 번만 발생하므로 하나의 스레드에만 영향을 미치기 때문에 ThreadStaticAttribute가 표시된 필드의 초기 값을 지정하지 마십시오. 초기 값을 지정하지 않으면 값 유형 인 경우 기본값으로 초기화되는 필드에 의존하거나 참조 유형 인 경우 NULL 참조 (Visual Basic에서는 없음)에 의존 할 수 있습니다.
다른 팁
이네스 골프 클럽 및 파리 르 부르제의 ThreadStatic
특성이 있습니다.비록 그것은 값을 만듭니다 당사의 initalization 코드는 실행에서 하나의 스레드입니다.의 모든 다른 스레드에는 이 값이 기본 유형에 대한 대신의 결과 초기화 코드입니다.
대신 값을 초기화,감싸는 속성을 초기화한다.
[ThreadStatic]
readonly static private AccountManager _instance;
private AccountManager()
{
}
static public AccountManager Instance
{
get
{
if ( _instance == null ) _instance = new AccountManager();
return _instance;
}
}
기 때문에 값 _instance
는 독특한 스레드당,잠금 해안에 필요한 제공하고 처리할 수 있습 같은 다른 어떤 느리게 초기화 값입니다.
당신은 고전을 쳤다 [ThreadStatic]
"101"여기.
정적 이니셜 라이저는 한 번만 발사됩니다. ~ 일지라도 표시됩니다 [ThreadStatic]
, 따라서 다른 스레드 (첫 번째 스레드를 제외하고)는 이것을 초기화되지 않은 것으로 보게됩니다.
일어나고있는 일은 정적 필드가 한 번만 초기화되므로 다른 스레드가 필드를 읽으려고 할 때 _instance가 다시 초기화 될 수 없기 때문에 (기본값이기 때문에) NULL이됩니다. 그것은 단지 생각이지만 나는 완전히 벗어날 수 있지만 그것이 내가 생각하는 일입니다.
ThreadStaticAttribute가 표시된 정적 필드는 스레드간에 공유되지 않습니다. 각 실행 스레드에는 분리 된 인스턴스의 필드가 있으며 독립적으로 해당 필드의 값을 설정하고 가져옵니다. 필드가 다른 스레드에서 액세스되면 다른 값이 포함됩니다.