我正在开发一个使用CSLA框架和自定义身份验证的Winforms应用程序(即中间层/服务器管理身份验证),并且正在实施会话超时功能。
我遇到的问题是校长的一个奇怪问题。当我在会话超时后登录时,我创建了一个新的Principal对象(我自己的自定义Principal对象)。这被分配给当前线程,它始终是UI线程(我已经检查过并且还使用Control.Invoke来确保登录表单在UI线程上运行,并且此表单的click事件在UI线程上运行)
然而,在此之后,当我点击UI中的按钮时,我可以看到Principal已恢复为 OLD Principal。
主UI线程能够恢复到之前的Principal是否有任何原因或任何条件?
主UI线程上的Principal周围是否有任何已知的陷阱?
我已经检查过,我没有在其他地方设置Thread.CurrentPrincipal。
更新
我已经通过更改为Windows.Forms.Timer
来触发我的会话超时来解决此问题,而不是之前我使用的是System.Timers.Timer
,然后在需要时使用Control.Invoke
。当我更改它时,我在UI线程上设置的Principal在下一次在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
答案 0 :(得分:1)
我相信正在发生的事情是,使用系统计时器,您的代码实际上是在一个单独的线程上执行的.net中的EACH线程可以拥有自己的主体集(如果您熟悉该属性,则为ThreadStatic)。然而,Windows计时器将在您设置主体的ui线程中运行计时器代码。请注意,当您的计时器代码正在运行时,ui没有响应,因为不会发生消息泵送,所以如果您的代码需要一段时间,您可能需要返回系统计时器。
要使新线程看到相同的主体,您应该在AppDomain上查看https://msdn.microsoft.com/en-us/library/system.appdomain.setthreadprincipal(v=vs.110).aspx以及SetPrincipalPolicy方法。