Maison > développement back-end > C++ > Comment gérer en toute sécurité les opérations cross-thread dans .NET pour les mises à jour de l'interface utilisateur ?

Comment gérer en toute sécurité les opérations cross-thread dans .NET pour les mises à jour de l'interface utilisateur ?

DDD
Libérer: 2025-01-12 17:07:46
original
578 Les gens l'ont consulté

How to Safely Handle Cross-Thread Operations in .NET for UI Updates?

É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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal