Éviter l'erreur « Opération cross-thread non valide » dans les mises à jour de l'interface utilisateur .NET
Dans .NET, tenter de modifier des éléments de l'interface utilisateur à partir d'un thread différent de celui qui les a créés entraîne la redoutable erreur « Opération inter-thread non valide ». Cela découle de la règle cruciale : les opérations d'interface utilisateur doivent être exécutées sur le thread qui a initialement créé l'élément d'interface utilisateur.
Illustrons avec un exemple de code :
<code class="language-csharp">System.Threading.Thread t = new System.Threading.Thread(() => { // Perform intensive operations... listView1.Items.Add(lots of items); // Error prone line! // More UI updates... }); t.Start();</code>
Ce code génère un fil de discussion pour gérer une tâche. Cependant, lorsque le fil tente de mettre à jour l'interface utilisateur (en ajoutant des éléments à listView1
), l'erreur se produit car la mise à jour n'a pas lieu sur le fil de discussion principal de l'interface utilisateur.
Approches sûres pour le threading de l'interface utilisateur
La manipulation directe de l'interface utilisateur à partir d'un fil de discussion non-UI est interdite. Voici deux solutions efficaces :
La méthode Invoke
: Si vous possédez une référence au contrôle de l'interface utilisateur (comme listView1
), utilisez la méthode Invoke
. Cette méthode met l'action en file d'attente pour exécution sur le thread de l'interface utilisateur.
La classe BackgroundWorker
: BackgroundWorker
simplifie les opérations asynchrones. Il crée un fil d'arrière-plan et facilite la communication entre le fil d'arrière-plan et le fil d'interface utilisateur, ce qui rend les mises à jour entre threads gérables.
<code class="language-csharp">BackgroundWorker bw = new BackgroundWorker(); bw.DoWork += (s, e) => { /* Create items here */ }; bw.RunWorkerCompleted += (s, e) => { /* Update listView1 here */ }; bw.RunWorkerAsync();</code>
Invoke
et BackgroundWorker
fournissent tous deux des mécanismes sûrs pour gérer les opérations cross-thread, garantissant que les mises à jour de l'interface utilisateur se produisent uniquement sur le thread approprié, évitant ainsi l'erreur « Opération cross-thread non valide ».
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!