2014-07-23 10 views
3

사용자 정의 인증 (즉, 중간 계층/서버가 인증을 관리)과 함께 CSLA 프레임 워크를 사용하는 Winforms 앱에서 작업 중이며 세션 시간 초과 기능을 구현하는 중입니다.Winforms 메인 UI 스레드 프린시 펄이 이전 버전으로 되 돌림

내가 겪고있는 문제는 교장에게 이상한 문제입니다. 세션 시간 초과 후 로그인 할 때 새로운 Principal 객체 (사용자 정의 Principal 객체)를 만듭니다. 이것은 항상 UI 스레드 인 현재 스레드에 할당됩니다 (UI 스레드에서 로그인 폼이 실행되도록하려면 Control.Invoke를 선택하고이 폼의 클릭 이벤트는 UI 스레드에서 실행 됨) .

그러나이 후에 UI에서 버튼을 클릭하면 주체가 OLD 교장으로 되돌아 갔음을 알 수 있습니다.

주 UI 스레드가 이전 주체로 되돌릴 수있는 이유가 있습니까?

주 UI 스레드에서 주체를 피할 수있는 알려진 문제가 있습니까?

나는 체크하고 Thread.CurrentPrincipal을 다른 곳에서는 설정하지 않을 것이다.

내 세션 타임 아웃을 트리거 할 Windows.Forms.Timer로 변경보다는 이전에 나는 System.Timers.Timer을 사용 한 후 필요한 Control.Invoke를 사용하여이 문제를 해결 한

UPDATE. 이 값을 변경하면 다음에 UI 스레드에서 실행될 때 UI 스레드에서 설정 한 주체가 그대로 남아 있습니다.

는 사람이 설명 할 수 ? 그래서 본질적으로 UI 스레드에서 Principal을 설정하는 것은 두 가지 다른 것을 의미 할 수 있습니다 ... 설정 할 때 필요한 확실한 컨텍스트가 있습니까?

내가 같은 문제로 보이는 가진 다른 사람들의 몇 가지를 발견했습니다

...

http://permalink.gmane.org/gmane.comp.windows.devel.dotnet.advanced/14046 https://groups.google.com/forum/#!topic/microsoft.public.dotnet.languages.csharp/_hLhcDB3jHA

답변

1

내가 무슨 일이 일어나고하면 해당 시스템 타이머와 코드 실제로 믿는다 는 별도의 스레드에서 실행되며 .net의 각 스레드는 고유 한 핵심 집합 (해당 특성에 익숙한 경우 해당 ThreadStatic)을 가질 수 있습니다. 그러나 Windows 타이머는 사용자가 principal을 설정 한 UI 스레드에서 타이머 코드를 실행합니다. 타이머 코드가 실행되는 동안 ui는 아무런 메시지 펌핑도 발생하지 않으므로 응답하지 않습니다. 따라서 코드가 잠시 걸리면 시스템 타이머로 돌아가고 싶을 것입니다.

새로운 스레드가 동일한 주체를 보게하려면 https://msdn.microsoft.com/en-us/library/system.appdomain.setthreadprincipal(v=vs.110).aspx과 AppDomain에서도 SetPrincipalPolicy 메서드를 사용해야합니다.