调用线程不能访问此对象,因为不同的线程拥有它

问题描述:

我有一个问题,每当我刷新程序栏我得到的错误调用线程不能访问此对象,因为不同的线程拥有它 我该如何删除它 沙善调用线程不能访问此对象,因为不同的线程拥有它

 backgroundWorker12 = new BackgroundWorker(); 
    timer1.Enabled = true; 
     //cancel any async processes running for the background worker 
    //backgroundWorker1.CancelAsync(); 
    backgroundWorker12.DoWork += (s, args) => 
    { 

     BackgroundWorker worker2 = s as BackgroundWorker; 
     worker2.WorkerReportsProgress = true; 

     float percentageDone = 20f; 
     //check if the user status and update the password in xml 
     CheckUseridPwd(); 


     //call the function to sync the wall chart data 

     //call the function to sync event relate data 

     percentageDone = 100f; 
     ValidateLogin2(txtUserID.Text.Trim(), txtPassword.Password.Trim(), -1); 
     worker2.ReportProgress((int)percentageDone); 

    };` 

这一点看起来像它的使用从错误的线程UI控件:

ValidateLogin2(txtUserID.Text.Trim(), txtPassword.Password.Trim(), -1); 

我建议你捕捉它增加了事件公顷以上代码局部字符串变量的用户名和密码ndler - 您可以在代理中使用这些捕获的变量。一切都这样,应该是正确的线程上:

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); 
}; 
+0

工作很大,但是当我们在代码的组合框结合上文中的数据,它会给同样的错误 – Shashank 2010-06-30 08:59:19

+0

@SHASHANK:我我害怕我不知道你的意思。绑定哪些数据?如上面哪个代码 - 我的还是你的?你试图在哪个线程中执行绑定? – 2010-06-30 09:16:11

+0

对不起,我写错了 谢谢 – Shashank 2010-06-30 12:52:20

看看你能不能用RunWorkerCompleted event of the BackgroundWorker,,因为你所访问的UI进度100%,即做了之后.. 那么你就不必担心关于WPF UI控件的线程亲和性 - 因为在右侧/ UI线程上再次调用事件处理程序。

其他选项(如果您需要在工作完成之前访问UI控件)将在工作启动之前将Dispatcher.CurrentDispatcher在UI线程上返回的对象 缓存,然后使用object.Invoke将其编组为来自正在执行DoWork处理程序的线程池线程的正确线程。见some code here

你试过调用ValidateLogin2

你可以做到直接从你的代码所示,或者ValidateLogin2检查,如果该方法本身需要调用。如果没有,继续和验证,但如果这样做,那么有它调用它本身

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