web-dev-qa-db-fra.com

Comment lire la liste déroulante à partir d'un thread autre que celui sur lequel il a été créé?

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?

28
nitrkli

Vous pouvez le faire comme ceci:

this.Invoke((MethodInvoker)delegate()
    {
        text = combobox.Text;
    });
51
BrandonZeider

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.

17
João Angelo

Le moyen le plus court est:

string text;
this.Invoke(() => text = combobox.Text);
4
Igor Vaschuk

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).

3
Morten Mertner