J'ai cet extrait de code: et voici la méthode quoi J'aime faire est de remplir mon Fonctionnement inter-thread non valide: Contrôle 'DataGridView1 a fait l'objet d'un accès d'un fil autre que celui créé. P>
blockQuote> J'essaie ceci p> mais rien n'a gagné dans le temps ?. J'aimerais que la mise à jour de DataGrid lorsque la BGW charge les données Fush Data Load on l'ajoutez à la DGV P> P> getallacte code>: p>
datagridview code> à l'aide de l'ouvrier d'arrière-plan une fois que j'exécuterais l'application, j'ai eu cette erreur: P>
4 Réponses :
Vous ne pouvez pas mettre à jour l'interface utilisateur à partir d'un fil d'antécédents.
Vous devez envoyer un événement à l'interface utilisateur, puis avoir quelque chose comme: p>
private void EventHandler(object sender, YourEventArgs e) { if (this.dataGridView1.InvokeRequired) { this.dataGridView1.Invoke((MethodInvoker)delegate { this.AddToGrid(e.YourData); }); } else { this.AddToGrid(e.YourData); } }
C'est parce que les trucs d'interface graphique ne peuvent pas être modifiés à partir d'autres threads que le fil de l'interface graphique. Pour résoudre ce problème, vous devez appeler les modifications sur le thread de l'interface graphique à l'aide du répartiteur.
Le DataGrid doit être configuré à l'avance, de sorte que tout ce que vous faites dans votre fonctionnement Async est remplir les données. P>
var data = ActeServices.getAllActes(0, 40); Dispatcher.BeginInvoke( new Action( () => { dataGridView1.DataSource = data; }))
Le dataGridView n'est pas un fil de sécurité. Cependant, définir la source de données si les données sont déjà disponibles doivent être suffisamment rapides. P>
Je recommanderais: p>
Utilisez uniquement votre travail d'arrière-plan pour charger les données dans un autre thread P> li>
Définissez la DataSource et les autres modifications du DataGridView dans l'événement RunworkerComplet (vous pouvez transmettre le résultat de la méthode Dowork à l'événement terminé en réglant p>
E.Result = acteservices.getallactes (0, 40); p> li>
Facultatif: Définissez DataGridView1.Autogeneratecolumns sur FAUX et ajoutez manuellement les colonnes dans les formulaires Windows Forms Designer ou dans le code pour éviter le scintillement. P> LI> ol>
+1 - J'étais au milieu de taper une réponse similaire lorsque celle-ci est apparue.
La classe Travailleur de fond a été conçue pour exécuter une opération de longue date sur un fil d'arrière-plan. Étant donné que vous n'êtes autorisé à accéder à des composants d'interface utilisateur du fil qui les a créés, vous pouvez utiliser le RunworkCompleted Événement de la classe de l'entreprise d'information Pour mettre à jour votre interface utilisateur une fois que votre gestionnaire de Dowork est terminé. De plus, vous pouvez mettre à jour en toute sécurité un interface utilisateur de progression à l'aide du progressée événement de la classe des opérateurs de fond. P>