2009-03-12 4 views
8

어떻게하면 C#에서 스레드 주체를 지우니까?C# 스레드 주체 지우기

나는이 잘 작동 후 결과 교장 다시 메인 스레드

AppDomain.CurrentDomain.SetThreadPrincipal(Thread.CurrentPrincipal); 

에 복사합니다

Membership.ValidateUser(username, password); 

을하는 백그라운드 스레드가 있습니다. 하지만, 내가 로그 오프하면 주체를 지우고 싶습니다. null로 설정하면 아무 것도하지 않습니다. Thread.CurrentPrincipal = null; 나는 시도하고

AppDomain.CurrentDomain.SetThreadPrincipal(Thread.CurrentPrincipal); 

를 통해 다시 설정하면 나는 오류

Default principal object cannot be set twice. 

어떤 아이디어를 얻을?

답변

3

에이 문제를 해결하기 위해 트릭을 설정할 완료되어

는 외관 주체를 생성하고 스레드로 그를 할당하는 것이 었습니다. 그런 다음 뒤에 현재 사용자에게 새 사용자를 전환 할 수 있습니다.

3

AppDomain을 종료하고 다시 작성하지 않고 주체를 다시 설정할 수 있다고 생각하지 않습니다. SetThreadPrincipal을 호출하면 한 번만 얻을 수 있습니다.

ValidateUser 이후에 만든 사용자 지정 사용자 지정 개체를 사용한다고 가정합니다. 아마도 내부 상태를 인증되지 않은 사용자에게 다시 설정하는 사용자의 프린시 ^에 "로그 아웃"메소드를 넣을 수 있습니다.

+0

그럴 수도 있습니다. Dispatcher 스레드에서 membership.validateuser를 몇 번 호출하면 아무런 문제가 없습니다. 항상 다른 principal을 씁니다. 아마도 잘못된 주체를 업데이트하려고합니다. validateUser가 어떤 주역을 업데이트했는지 알 수 있습니까? – gimpy

+0

예, SetThreadPrincipal 메서드를 한 번만 호출합니다. – TheZenker

3

주 스레드의 주체 만 설정하려면 백그라운드 스레드에 대한 참조를 전달한 다음 CurrentPrincipal 속성을 사용하여 주체를 설정하십시오.

mainThead.CurrentPrincipal = Thread.CurrentPrincipal. 원래 주요