【问题标题】:.Net Thread.CurrentPrincipal.Net Thread.CurrentPrincipal
【发布时间】:2015-04-20 13:06:00
【问题描述】:

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

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

【问题讨论】:

  • 你能贴一些代码吗?CurrentPrincipal“消失”?
  • 我试图了解为什么会丢失。我看到的代码是 foreach (EventHandlersubscriber in onApplicationIdle.GetInvocationList()) {subscriber.BeginInvoke(this, e, OnAsyncCompleted,subscriber); }
  • 我的意思是添加有关您的应用程序流程的更多信息。类似于“调用 WCF 服务 -> 接收异步响应 -> UpdateUI(此处 CurrentPrincipal 为空)”。只需发布一些更广泛的代码。

标签: c# multithreading


【解决方案1】:

当您在 .NET 中创建新线程时,父线程的主体不会自动传播。如果您正在创建线程,则必须自己执行此操作。

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    相关资源
    最近更新 更多