Inter-threads non valide dans les Windows Forms
Quelqu'un pourrait-il m'aider j'ai un problème, je vais essayer d'obtenir ce code fonctionne en arrière-plan via le pool de threads, mais je n'arrive pas à le faire fonctionner, je reçois cette erreur:
Cross-thread operation not valid: Control 'ListBox3' accessed
from a thread other than the thread it was created on.
Ici c'est le code que j'utilise:
private void DoWork(object o)
{
var list = ListBox3;
var request = createRequest(TxtServer.Text, WebRequestMethods.Ftp.ListDirectory);
using (var response = (FtpWebResponse)request.GetResponse())
{
using (var stream = response.GetResponseStream())
{
using (var reader = new StreamReader(stream, true))
{
while (!reader.EndOfStream)
{
list.Items.Add(reader.ReadLine());
ResultLabel.Text = "Connected";
}
}
}
}
}
OriginalL'auteur Terrii | 2012-12-19
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin d'invoquer un délégué à la mise à jour de la liste. Voir ce MSDN exemple.
OriginalL'auteur jac
Vous pouvez accéder à controll par ce faire
OriginalL'auteur Parviz Bazgosha
Vous pouvez également accéder à des contrôles par invoquer l'aide de la syntaxe suivante avec un délégué Action:
OriginalL'auteur Steve
Vous ne pouvez pas accéder au contrôle à partir d'un thread séparé, il doit être de la même thread que le contrôle a été créé à partir d'.
OriginalL'auteur Dan OConnell
Cette extension de la méthode résout le problème.
Utiliser dans votre thread de travail comme suit
OriginalL'auteur SkeetJon
Je suis en supposant que
DoWork
est lancé sur un autre thread. Le code d'accèsListBox3
, qui est une interface graphique de contrôle. .NET restreint l'accès aux contrôles d'interface utilisateur graphique pour le fil qui les a créés.Vous avez besoin de maréchal d'accès pour le contrôle de retour pour le thread d'INTERFACE utilisateur. Comment avez-vous invoquer
DoWork
?lorsque le bouton est cliqué, il n'cette commande: pool de threads.QueueUserWorkItem(nouveau WaitCallback(DoWork));
OriginalL'auteur Brian Rasmussen
Vous pouvez le faire plutôt que d'accéder aux contrôles de l'autre que le thread d'INTERFACE utilisateur nécessitent invoquer.
Lorsque vous démarrez (je suppose que vous utilisez le composant BackgroundWorker), passer dans l'url de votre zone de texte à
RunWorkerAsync(TxtServer.Text)
comme argument, alors:Ensuite sur votre événement Terminé cast e.résultat de la liste et l'ajouter à votre contrôle.
OriginalL'auteur