J'essaie de lire une liste déroulante.Texte à partir d'un thread autre que le thread sur lequel il a été créé mais j'obtiens l'erreur:
Une exception non gérée de type "System.InvalidOperationException" s'est produite dans System.Windows.Forms.dll
Informations supplémentaires: Opération cross-thread non valide: Contrôle 'levelsComboBox' accessible à partir d'un thread autre que celui sur lequel il a été créé.
J'ai déjà utilisé .Invoke mais uniquement pour définir des propriétés, comment puis-je l'utiliser pour lire combobox.Text? Parce que .Invoke renvoie void et j'ai besoin d'une chaîne. Ou y a-t-il une autre façon de le faire sans l'invocation?
Vous pouvez le faire comme ceci:
this.Invoke((MethodInvoker)delegate()
{
text = combobox.Text;
});
Vous pouvez toujours utiliser Invoke
et le lire dans une variable locale.
Quelque chose comme ça:
string text;
this.Invoke(new MethodInvoker(delegate() { text = combobox.Text; }));
Puisque Invoke
est synchrone, vous avez la garantie que la variable text
contiendra la valeur du texte de la zone de liste déroulante après son retour.
Le moyen le plus court est:
string text;
this.Invoke(() => text = combobox.Text);
La solution la plus simple consiste à utiliser la classe BackgroundWorker pour exécuter le travail sur un autre thread, tout en étant toujours en mesure de mettre à jour l'interface utilisateur (par exemple lors du rapport de progression ou lorsque la tâche est terminée).