C# 在Winform中使用UI事件时设置CurrentPrincipal失败

C# 在Winform中使用UI事件时设置CurrentPrincipal失败,c#,multithreading,winforms,C#,Multithreading,Winforms,全部 我在尝试在WinForm应用程序上设置Thread.CurrentPrincipal时遇到了一个问题 表单上有两个按钮,按钮1和按钮2。按钮1设置Thread.CurrentPrincipal,按钮2显示CurrentPrincipal。到目前为止,一切进展顺利 private void button1_Click(object sender, EventArgs e) { SetPermission(); } private void SetPermission() {

全部

我在尝试在WinForm应用程序上设置Thread.CurrentPrincipal时遇到了一个问题

表单上有两个按钮,按钮1和按钮2。按钮1设置Thread.CurrentPrincipal,按钮2显示CurrentPrincipal。到目前为止,一切进展顺利

private void button1_Click(object sender, EventArgs e)
{
        SetPermission();
}

private void SetPermission()
{
        Thread.CurrentPrincipal = new MyPrinciple() { User = "xxxx" };
}

private void button2_Click(object sender, EventArgs e)
{
        Console.WriteLine("Tread principal:{0},{1}", Thread.CurrentThread.Name, Thread.CurrentPrincipal.ToString());
}
然后我修改了一些代码。 我想在表单显示后自动设置主体。因此我在Form.show上添加了一个事件

void Form1_Shown(object sender, EventArgs e)
{
        Dispatcher.CurrentDispatcher.Invoke(new Action(() => { SetPermission(); }));
}

public Form1()
{
        InitializeComponent();
        this.Shown += Form1_Shown;
}
当我点击按钮2显示princpal时,我什么也没看到

我试图在窗体的构造函数上设置主体。当我点击按钮2时,我得到了预期的结果

public Form1()
{
        InitializeComponent();
        //this.Shown += Form1_Shown;
        SetPermission();
}
我在谷歌上搜索过,现在我还不知道。这两种方式有什么不同

非常感谢。

尝试使用

AppDomain.CurrentDomain.SetThreadPrincipal(new MyPrinciple() { User = "xxxx" })
而不是

Thread.CurrentPrincipal = new MyPrinciple() { User = "xxxx" };

您是否测试过在没有Dispatcher.CurrentDispatcher.Invoke(..)的情况下调用SetPermissio()?是的,结果相同。不能得到原则。嗯。。有错误吗?哪个?或者处理程序或setPermision()没有被执行?请注意,显示的事件只发送一次-第一次显示表单时。是的,我调试了它。它绝对执行了。也没有错误。我试图在构造函数中调用button1.PerformClick时失败。嗯…似乎所有的事件方法都不能工作。我很确定这还有另一个原因。在调用buttons事件之前,必须等待Form.Load。不要在你的cntr里那样做。非常感谢你,沃尔夫冈。我试过了。实际上,我在单击按钮2时看到了MyPrincipal,但我在这里有另一个问题:为什么在setPermission方法中的“AppDomain.CurrentDomain.SetThreadPrincipal(new MyPrincipal(){User=“xxxx”})”之后看不到我的主体。对不起。我自己也不太清楚:我认为这与系统和应用程序线程如何同步有关。我查看了我的一个解决方案,我是如何做到的,因为我偶尔也会遇到同样的问题。