Winforms主UI线程主体恢复到以前

本文关键字:恢复 主体 UI 线程 Winforms | 更新日期: 2023-09-27 18:14:14

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

我遇到的问题是校长的一个奇怪的问题。当我在会话超时后登录时,我创建一个新的Principal对象(我自己的自定义Principal对象)。这被分配给当前线程,这总是UI线程(我已经检查过了,我也在使用控制。调用以确保登录表单在UI线程上运行,并且此表单的click事件在UI线程上运行)。

然而,在此之后,当我点击UI中的按钮时,我可以看到主体已经恢复到OLD主体。

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

是否有任何已知的陷阱,以避免在主UI线程的主体?

我已经检查了,我没有设置线程。CurrentPrincipal在其他任何地方。

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

有人能解释一下吗?所以从本质上讲,在UI线程上设置Principal可以意味着两件不同的事情……在设置它的时候,我是否需要确定一些上下文?

我发现其他几个人似乎也有同样的问题…

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

Winforms主UI线程主体恢复到以前

我相信正在发生的事情是,与系统计时器你的代码实际上是在一个单独的线程上执行的,并且。net中的每个线程都可以有自己的主体集(它的ThreadStatic,如果你熟悉这个属性)。然而,Windows计时器将在你设置主体的ui线程中运行计时器代码。请注意,当你的计时器代码运行时,ui没有响应,因为没有消息泵送发生,所以如果你的代码需要一段时间,你会想回到系统计时器。

要使新线程看到相同的主体,您应该查看https://msdn.microsoft.com/en-us/library/system.appdomain.setthreadprincipal(v=vs.110).aspx以及AppDomain上的SetPrincipalPolicy方法。