Comment mettre à jour une zone de liste par un appel asynchrone?
J'ai développé un windows forms application en c#, je veux juste mettre à jour des éléments d'une liste dans le formulaire principal par spin prépare un autre thread sans blocage de l'interface graphique de formulaire.
Etant donné que les threads ne peuvent pas accéder à la forme des entités telles que les listbox, j'ai pensé à l'utilisation de délégués.
Code suivant dans le ci-dessous montre comment j'ai utilisé un délégué à le faire tâche, mais elle bloque l'interface graphique de formulaire. donc, je veux juste de les convertir en asynchrone délégué des mises à jour de zone de liste sans blocage de l'interface graphique de Formulaire
délégué déclaration
delegate void monitoringServiceDel();
appelant le délégué
new monitoringServiceDel(monitoringService).BeginInvoke(null, null);
délégué de la méthode de la mise en œuvre
private void monitoringService()
{
this.listEvents.Invoke(new MethodInvoker(delegate()
{
int i = 0 ;
while (i<50)
{
listEvents.Items.Add("count :" + count++);
Thread.Sleep(1000);
i ++;
}
}));
}
OriginalL'auteur Tharik Kanaka | 2012-04-04
Vous devez vous connecter pour publier un commentaire.
Pour Gagner Formulaires dont vous aurez besoin pour utiliser le Contrôle du Invoquer méthode:
Le scénario de base est:
Quelque chose le long des lignes de:
Cela devrait vous aider à aller dans la bonne direction.
Edit: exemple de travail
Voir mise à jour avec de travail exemple de code.
Merci beaucoup sa fonctionne 🙂
m'a sauvé la vie. Fonctionne parfaitement
OriginalL'auteur Metro Smurf
Si vous modifiez un élément de l'INTERFACE utilisateur, alors vous allez AVOIR à bloquer le thread d'INTERFACE utilisateur. Si les articles sont en rafales ou besoin de traitement entre l'ajout de chacun, alors vous pourriez vouloir penser à lancer le traitement en coulisses (via un backgroundworker ou un Tâche). Mais, si vous êtes juste de prise de données et le remplissage de la liste, alors vous êtes obligé d'utiliser le thread d'INTERFACE utilisateur.
Qui crée le panneau et de la liste? Si l'INTERFACE utilisateur, ensuite, vous recevez un contexte d'erreur. Cependant, je suppose que vous pourriez créer le panneau et la liste dans le backgroundworker et puis il suffit de passer à l'INTERFACE utilisateur d'être branché par le thread principal?
Désolé, j'ai supprimé le commentaire. Vous avez les deux Panneaux de prêt dans votre Formulaire. Vous utilisez le composant BackgroundWorker pour obtenir les Données qui peuplent la zone de liste. Une fois le composant BackgroundWorker est terminée et que vous avez toutes vos Données, vous pouvez accéder à vos commandes sans problèmes et le croisement de fils. Si vous il suffit de remplacer le panneau qui est visible et de l'ensemble de la zone de liste de contenu.
Comment est-ce différent de ce que j'ai dit (au-delà d'être plus explicite?) Une fois que vous avez les données, vous devez bloquer le thread d'INTERFACE utilisateur?
Je ne le qualifierais pas exactement le blocage du Thread d'INTERFACE utilisateur. Le BackgroundWorker feuilles de l'INTERFACE utilisateur Réactive et le Panneau de Visibilité swap + ListBox remplissage prendra de 0,001 seconde à accomplir et de ne pas figer l'INTERFACE utilisateur.
OriginalL'auteur Justin Pihony
La solution la plus simple serait d'utiliser le
BackgroundWorker
de contrôle, combiné avec deuxPanels
. L'idée est d'avoir un panneau sur le premier planVisible
lors du chargement du formulaire, et ont uneImageBox
intérieur de celui-ci qui joue un simple chargement gif. LeListBox
sera à l'intérieur de l'autre panneau qui ne seront pas visibles par défaut et sera juste derrière le premier panneau.Une fois que le formulaire est chargé, démarrez votre
BackgroundWorker
et accomplir toutes les Données de la récupération ou de mise à jour que vous avez à faire et une fois que la Tâche est terminée, définissez les données à l'intérieur de votre zone de liste et simplement amener laListBox
panneau et de le rendre visible.De cette façon, vous aurez un Semi chargement Asynchrone de votre
ListBox
, alors il n'est pas mis à jour après chaque élément ajouté. Vous pouvez utiliser cette technique quand vous le voulez, pas simplement sur le formulaire de charge de!Voici un exemple de code:
OriginalL'auteur Alexandre
Vous devez séparer la fonction de mise à jour de l'INTERFACE utilisateur et long-temps.
Pour gérer logique de l'INTERFACE utilisateur..
À faire processus asynchrone à l'aide de TaskParallel
OriginalL'auteur aifarfa