C# 如何避免主体从工作线程传播到GUI线程
我们有一个Windows应用程序,它有一个需要更新GUI的工作线程。我们使用BeginInvoke异步执行此操作。我们的问题(在下面的示例中演示)是,主体被传播到我们想要避免的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
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线程上设置主体的问题。但这仍然是一个解决方案,谢谢。