C# Winforms主UI线程主体还原到上一个

C# Winforms主UI线程主体还原到上一个,c#,multithreading,winforms,csla,iprincipal,C#,Multithreading,Winforms,Csla,Iprincipal,我正在开发一个Winforms应用程序,它使用CSLA框架和自定义身份验证(即中间层/服务器管理身份验证),并且正在实现会话超时功能 我遇到的问题是校长的一个奇怪的问题。当会话超时后登录时,我会创建一个新的主体对象(我自己的自定义主体对象)。这将分配给当前线程,该线程始终是UI线程(我已经检查并正在使用Control.Invoke确保登录表单在UI线程上运行,并且此表单的单击事件在UI线程上运行) 但是,在此之后,当我单击UI中的按钮时,我可以看到主体已恢复为旧主体 主UI线程是否有任何原因或条

我正在开发一个Winforms应用程序,它使用CSLA框架和自定义身份验证(即中间层/服务器管理身份验证),并且正在实现会话超时功能

我遇到的问题是校长的一个奇怪的问题。当会话超时后登录时,我会创建一个新的主体对象(我自己的自定义主体对象)。这将分配给当前线程,该线程始终是UI线程(我已经检查并正在使用Control.Invoke确保登录表单在UI线程上运行,并且此表单的单击事件在UI线程上运行)

但是,在此之后,当我单击UI中的按钮时,我可以看到主体已恢复为旧主体

主UI线程是否有任何原因或条件可以恢复到以前的主体?

在主UI线程上的主体周围是否有任何已知的陷阱需要避免?

我已经检查过了,没有在其他任何地方设置Thread.CurrentPrincipal

更新

我已通过更改为
Windows.Forms.Timer
来触发会话超时来解决此问题,而不是以前使用
System.Timers.Timer
然后在需要时使用
控件。调用
。当我改变这一点时,我在UI线程上设置的主体在下次UI线程上执行时仍然存在

有人能解释一下吗?因此,从本质上看,在UI线程上设置主体可能意味着两件不同的事情……设置时是否需要确定某种上下文?

我发现另外两个人也有同样的问题


我相信,使用系统计时器,您的代码实际上是在一个单独的线程上执行的,并且.net中的每个线程都可以有自己的主体集(如果您熟悉该属性,则为ThreadStatic)。不过,Windows计时器将在您设置主体的ui线程中运行您的计时器代码。请注意,当您的计时器代码运行时,ui没有响应,因为不会发生消息泵送,因此如果您的代码需要一段时间,您可能希望返回系统计时器

要使新线程看到相同的主体,您应该查看AppDomain上的SetPrincipalPolicy方法