2010-06-30 3 views
2

J'ai un problème chaque fois que je rafraîchis la barre de programme j'obtiens l'erreur Le thread appelant ne peut pas accéder à cet objet car un thread différent le possède comment puis-je l'enlever shashankLe thread appelant ne peut pas accéder à cet objet car un thread différent le possède

 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); 

    };` 

Répondre

5

Ce bit ressemble qu'il utilise des contrôles de l'interface utilisateur du mauvais fil:

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

Je vous suggère de capturer l'utilisateur et mot de passe dans les variables de chaîne locale au-dessus du code qui ajoute l'événement ha ndler - vous pouvez utiliser ces variables capturées dans votre délégué. Que tout moyen devrait être sur le fil droit:

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

son grand travail mais quand nous lier les données avec combobox comme ci-dessus dans le code, il donnera même erreur – Shashank

+0

@SHASHANK: I J'ai peur, je ne sais pas ce que tu veux dire. Lier les données? Comme ci-dessus dans quel code - le mien ou le vôtre? Quel thread essayez-vous d'effectuer la liaison? –

+0

Désolé, j'écris quelque chose de mal merci – Shashank

0

Voyez si vous pouvez utiliser le RunWorkerCompleted event of the BackgroundWorker, puisque vous accédez à l'interface utilisateur seulement après des progrès 100% soit fait .. alors vous pas à vous inquiéter à propos de l'affinité de thread des contrôles d'interface utilisateur WPF - puisque le gestionnaire d'événements est appelé à nouveau sur le thread droit/interface utilisateur.

L'autre option (si vous devez accéder aux contrôles de l'interface utilisateur avant la fin du travail) est de mettre en cache l'objet retourné par Dispatcher.CurrentDispatcher sur le thread UI avant le démarrage du travail, puis d'utiliser object.Invoke pour marshal to le thread droit du thread de pool de threads qui exécute votre gestionnaire DoWork. Voir some code here.

0

Avez-vous essayé d'invoquer ValidateLogin2

vous pouvez le faire directement à partir de votre code ci, ou ValidateLogin2 Vérifiez que la méthode elle-même nécessite de faire appel. Sinon, aller de l'avant et de valider, mais si elle le fait, il a lui-même appeler

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