.Net Thread.CurrentPrincipal

时间:2015-04-20 13:06:00

标签: c# multithreading

在什么条件下,当前线程的主体丢失。 我有一个Windows窗体应用程序,它使用主线程的主体,并通过WCF从服务器接收通知。在某些客户端,我为当前主题松开了Principal,我不明白为什么。 "失去"似乎来自代码:

foreach (EventHandler subscriber in onApplicationIdle.GetInvocationList())
{
    subscriber.BeginInvoke(this, e, OnAsyncCompleted, subscriber);
}

1 个答案:

答案 0 :(得分:4)

在.NET中创建新线程时,父线程的主体不会自动传播。如果你正在制作帖子,你必须自己这样做。

如果您正在使用async我相信它在其创建的任何线程中都有自己的身份传播规则。

调用BeginInvoke会将该方法放入ThreadPool中(我相信!),因此线程池主体适用于此处。我认为这意味着你必须自己做!

您可以让所有线程通过调用AppDomain.SetPrincipalPolicy自动设置主体,但这只涵盖PrincipalPolicy enum中的三种类型。

否则,您可以在线程代码中手动设置Thread.Current.Principal()。

请参阅wrong-thread-currentprincipal-in-async-wcf-end-method Stack溢出帖子进行类似的讨论。