J'ai un scénario. (Windows Forms, C #, .NET)
- Il existe un formulaire principal qui héberge un certain contrôle utilisateur.
- Le contrôle utilisateur effectue une opération de données volumineuse, de sorte que si j'appelle directement la
UserControl_Load
méthode, l'interface utilisateur ne répond plus pendant la durée d'exécution de la méthode de chargement. - Pour surmonter cela, je charge des données sur différents threads (en essayant de modifier le code existant aussi peu que possible)
- J'ai utilisé un thread de travail en arrière-plan qui chargera les données et, une fois terminé, notifiera à l'application qu'elle a fait son travail.
- Maintenant est venu un vrai problème. Toute l'interface utilisateur (formulaire principal et ses contrôles utilisateur enfants) a été créée sur le thread principal principal. Dans la méthode LOAD de usercontrol, je récupère des données en fonction des valeurs de certains contrôles (comme la zone de texte) sur userControl.
Le pseudocode ressemblerait à ceci:
CODE 1
UserContrl1_LoadDataMethod()
{
if (textbox1.text == "MyName") // This gives exception
{
//Load data corresponding to "MyName".
//Populate a globale variable List<string> which will be binded to grid at some later stage.
}
}
L'exception qu'il a donnée était
Opération inter-thread non valide: contrôle accessible à partir d'un thread autre que le thread sur lequel il a été créé.
Pour en savoir plus, j'ai fait une recherche sur Google et une suggestion est venue comme utiliser le code suivant
CODE 2
UserContrl1_LoadDataMethod()
{
if (InvokeRequired) // Line #1
{
this.Invoke(new MethodInvoker(UserContrl1_LoadDataMethod));
return;
}
if (textbox1.text == "MyName") // Now it wont give an exception
{
//Load data correspondin to "MyName"
//Populate a globale variable List<string> which will be binded to grid at some later stage
}
}
MAIS MAIS MAIS ... il semble que je suis de retour à la case départ. L'Application ne répond plus. Cela semble être dû à l'exécution de la ligne # 1 si condition. La tâche de chargement est à nouveau effectuée par le thread parent et non par le troisième que j'ai généré.
Je ne sais pas si j'ai perçu ce bien ou ce mal. Je suis nouveau dans le filetage.
Comment puis-je résoudre ce problème et quel est également l'effet de l'exécution de la ligne # 1 en cas de blocage?
La situation est la suivante : je veux charger des données dans une variable globale basée sur la valeur d'un contrôle. Je ne veux pas modifier la valeur d'un contrôle à partir du thread enfant. Je ne vais jamais le faire à partir d'un thread enfant.
Donc, uniquement accéder à la valeur afin que les données correspondantes puissent être extraites de la base de données.