Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何避免主体从工作线程传播到GUI线程_C#_Windows_Multithreading_Security_Windows Security - Fatal编程技术网

C# 如何避免主体从工作线程传播到GUI线程

C# 如何避免主体从工作线程传播到GUI线程,c#,windows,multithreading,security,windows-security,C#,Windows,Multithreading,Security,Windows Security,我们有一个Windows应用程序,它有一个需要更新GUI的工作线程。我们使用BeginInvoke异步执行此操作。我们的问题(在下面的示例中演示)是,主体被传播到我们想要避免的GUI线程,因为在我们的实际应用程序中,我们会处理由于错误标识而失败的服务器请求。这是避免这种传播的一种方法吗 private Thread _thread; public Form1() { InitializeComponent(); Thread.CurrentPrincipal

我们有一个Windows应用程序,它有一个需要更新GUI的工作线程。我们使用BeginInvoke异步执行此操作。我们的问题(在下面的示例中演示)是,主体被传播到我们想要避免的GUI线程,因为在我们的实际应用程序中,我们会处理由于错误标识而失败的服务器请求。这是避免这种传播的一种方法吗

  private Thread _thread;

  public Form1()
  {
     InitializeComponent();

     Thread.CurrentPrincipal = new GenericPrincipal(new GenericIdentity("MainUser"), new[] { "User" });

     _thread = new Thread(ThreadProc);
     _thread.Start(this);
  }

  private void ThreadProc(object parameter)
  {
     Thread.CurrentPrincipal = new GenericPrincipal(new GenericIdentity("ThreadUser"), new[] { "User" });

     var form = parameter as Form1;

     while (true)
     {
        form.BeginInvoke(new Action(() => ShowIdentity()));
        Thread.Sleep(4000);
     }
  }

  private void ShowIdentity()
  {
     lblIdentity.Text = Thread.CurrentPrincipal.Identity.Name;
  }

有关在.NET中模拟Windows用户的说明,请参阅。这就是说,如果您在客户端计算机上执行此操作,则需要在UI用户的帐户下访问目标帐户的密码,这可能是您不想要的。为了防止出现这种情况,您需要让UI用户可以访问服务器端服务,或者使用中间服务(例如,客户端计算机上的服务器托管服务或Windows服务)来代理对服务器端服务的调用,同时在有权访问目标服务的帐户下运行。

因此我认为您可以获得该名称标签上是否印有“主要用户”

所发生的事情不是线程。主线程的Principal正在传播到另一个线程,而是在同一个线程(主线程)上执行
ShowIdentity

Invoke
BeginInvoke
将要在创建控件的线程上完成的工作排队(或者说“在创建控件底层句柄的线程上异步执行指定的委托”)

这两种方法的区别在于,
Invoke
将阻塞,直到工作项已完成线程,而
BeginInvoke
仅将工作项添加到队列中并立即返回

因此,在您的示例中,每4秒从您创建的线程向该队列添加一个
操作
。由于UI线程不忙于做其他事情,它将在排队后很快处理此工作-但它将在UI线程上运行(其关联主体名为“MainUser”)


这有意义吗?

如果我理解正确,这就解决了错误用户调用服务器的问题,而不是如何防止工作线程在GUI线程上设置主体的问题。但这仍然是一个解决方案,谢谢。