Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
Wpf 调用线程无法访问此对象,因为其他线程拥有它_Wpf_Multithreading - Fatal编程技术网

Wpf 调用线程无法访问此对象,因为其他线程拥有它

Wpf 调用线程无法访问此对象,因为其他线程拥有它,wpf,multithreading,Wpf,Multithreading,每当我刷新prograss栏时,我都会遇到一个问题,因为调用线程不能访问这个对象,因为它是另一个线程拥有的 我怎样才能删除它 沙申克 此位看起来使用了来自错误线程的UI控件: ValidateLogin2(txtUserID.Text.Trim(), txtPassword.Password.Trim(), -1); 我建议您在添加事件处理程序的代码上方的本地字符串变量中捕获用户和密码-您可以在代理中使用这些捕获的变量。这样,一切都应该在正确的线程上: backgroundWorker12

每当我刷新prograss栏时,我都会遇到一个问题,因为调用线程不能访问这个对象,因为它是另一个线程拥有的 我怎样才能删除它 沙申克


此位看起来使用了来自错误线程的UI控件:

 ValidateLogin2(txtUserID.Text.Trim(), txtPassword.Password.Trim(), -1);
我建议您在添加事件处理程序的代码上方的本地字符串变量中捕获用户和密码-您可以在代理中使用这些捕获的变量。这样,一切都应该在正确的线程上:

backgroundWorker12 = new BackgroundWorker();
timer1.Enabled = true;

string user = txtUserID.Text.Trim();
string password = txtPassword.Password.Trim();
backgroundWorker12.DoWork += (s, args) =>
{
    // ... same code as before up to here
    ValidateLogin2(user, password, -1); 
    worker2.ReportProgress((int)percentageDone);
};
查看是否可以使用,因为只有在进度达到100%即完成后才能访问UI。。 这样您就不必担心WPF UI控件的线程亲和力,因为事件处理程序会在右侧/UI线程上再次调用

另一个选项(如果您需要在工作完成之前访问UI控件)是缓存对象
在工作开始之前由UI线程上的Dispatcher.CurrentDispatcher返回,然后使用object.Invoke从执行DoWork处理程序的线程池线程封送到正确的线程。请参阅。

您是否尝试调用
ValidateLogin2

您可以直接从显示的代码中执行,也可以在
ValidateLogin2
中检查方法本身是否需要调用。如果没有,请继续验证,但如果有,请让它自己调用

void ValidateLogin2(...)
{
  if (this.InvokeRequired)    
  {        
    //Invokes itself if required        
    BeginInvoke(new MethodInvoker(delegate(){ValidateLogin2(...);}));
  } 
  else 
  {
     //validate login here    
  }
}

它的工作非常好,但是当我们在代码中用上面的combobox绑定数据时,它会给出相同的结果error@SHASHANK字体恐怕我不懂你的意思。绑定哪些数据?如上所述,在哪个代码中-我的还是你的?您试图在哪个线程中执行绑定?有一种更简单的方法Dispatcher@Rev:这取决于您想做什么。对于报告简单的进度,
BackgroundWorker
非常方便。对于其他事情,我通常使用调度器。
void ValidateLogin2(...)
{
  if (this.InvokeRequired)    
  {        
    //Invokes itself if required        
    BeginInvoke(new MethodInvoker(delegate(){ValidateLogin2(...);}));
  } 
  else 
  {
     //validate login here    
  }
}