Le thread appelant ne peut pas accéder à cet objet, car un autre thread en est le propriétaire
j'ai un problème à chaque fois que j'actualise la corrosion bar, je reçois le message d'erreur Le thread appelant ne peut pas accéder à cet objet, car un autre thread en est le propriétaire
comment puis-je le supprimer
shashank
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);
};`
Vous devez vous connecter pour publier un commentaire.
Ce bit dirait que c'est à l'aide de contrôles d'INTERFACE utilisateur de la mauvaise fil:
Je vous suggère de capture de l'utilisateur et le mot de passe dans les locaux de la chaîne de variables ci-dessus le code qui ajoute le gestionnaire d'événements, vous pouvez utiliser ces variables capturées à l'intérieur de votre délégué. De cette façon, tout doit être sur le fil de droite:
BackgroundWorker
est assez pratique. Pour les autres choses que j'ai généralement l'utilisation d'un Répartiteur.Voir si vous pouvez utiliser la RunWorkerCompleted cas de le BackgroundWorker, puisque vous avez accès à l'INTERFACE utilisateur seulement après que le progrès est à 100% c'est à dire faire..
Ensuite, vous n'auriez pas à vous soucier de fil affinité de WPF contrôles d'INTERFACE utilisateur - depuis le gestionnaire d'événements est appelé de nouveau à droite/Thread d'INTERFACE utilisateur.
L'autre option (si vous avez besoin d'accéder à des commandes de l'INTERFACE avant le travail est terminé) est de mettre en cache l'objet
retourné par le Dispatcher.CurrentDispatcher sur le Thread de l'INTERFACE utilisateur avant le début des travaux, puis utiliser l'objet.Invoquer de maréchal pour le droit fil de la piscine thread qui est de l'exécution de votre DoWork gestionnaire. Voir un peu de code ici.
Avez-vous essayé d'invoquer
ValidateLogin2
vous pouvez soit le faire directement à partir de votre code, ou dans
ValidateLogin2
vérifier si la méthode elle-même, nécessite l'invocation. Si non, aller de l'avant et de le valider, mais si elle le fait, alors il s'appeler elle-même