C # Exception du fil d'arrière-plan: "Opération transversale non valide: contrôle '...' accessible à partir d'un fil autre que le thread sur lequel il a été créé."
Cet article aborde une erreur C # commune rencontrée lorsque vous travaillez avec des threads d'arrière-plan et des éléments d'interface utilisateur: "Le thread d'appel ne peut pas accéder à cet objet car un thread différent le possède." Cela se produit parce que les éléments d'interface utilisateur sont généralement créés et détenus par le fil d'interface utilisateur principal. Tenter de les modifier à partir d'un thread d'arrière-plan viole la sécurité du fil.
Le problème:
L'exception se produit lorsqu'un thread d'arrière-plan essaie d'accéder ou de modifier un élément d'interface utilisateur (comme une zone de texte ou un autre contrôle) créé sur le thread principal. WPF et d'autres cadres d'interface utilisateur appliquent cette restriction pour empêcher les conditions de course et la corruption des données.
La solution: en utilisant Dispatcher.Invoke
La solution implique le rassemblement de la mise à jour de l'interface utilisateur vers le thread principal à l'aide de la méthode Dispatcher.Invoke
. Dispatcher.Invoke
s'assure que la mise à jour de l'interface utilisateur se produit sur le thread correct, résolvant la violation d'accès croisé.
Exemple de modification de code:
Disons que vous avez une méthode GetGridData
en cours d'exécution sur un thread d'arrière-plan qui doit mettre à jour une zone de texte nommée txtSearchCountry
:
Code original (problématique):
<code class="language-csharp">private void GetGridData(object sender, int pageIndex) { // ... other code ... objUDMCountryStandards.Country = txtSearchCountry.Text.Trim() != string.Empty ? txtSearchCountry.Text : null; // ... more code ... }</code>
CODE CORROGÉ USING UTILISE Dispatcher.Invoke
:
<code class="language-csharp">private void GetGridData(object sender, int pageIndex) { // ... other code ... this.Dispatcher.Invoke(() => { objUDMCountryStandards.Country = txtSearchCountry.Text.Trim() != string.Empty ? txtSearchCountry.Text : null; }); // ... more code ... }</code>
La méthode Dispatcher.Invoke
prend un délégué (une fonction anonyme dans ce cas) comme argument. Ce délégué contient le code qui doit être exécuté sur le thread d'interface utilisateur. Dispatcher.Invoke
bloque jusqu'à ce que le délégué termine l'exécution sur le thread d'interface utilisateur. Cela garantit la sécurité des filetages.
En utilisant Dispatcher.Invoke
, l'affectation à objUDMCountryStandards.Country
est désormais effectuée en toute sécurité sur le thread d'interface utilisateur principal, empêchant l'exception. N'oubliez pas d'appliquer ce modèle à toutes les modifications des éléments d'interface utilisateur effectuées à partir des threads d'arrière-plan.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!