comment maintenir un fil de premier plan avec le fil d'arrière-plan. Si j'essaie d'ajouter des éléments à la liste dans do work, cela me donne une exception de threads croisés.BackGroundWorker
Répondre
En général, les mises à jour de l'interface utilisateur ne peuvent être effectuées qu'à partir du thread d'interface utilisateur lui-même.
Le mécanisme pour ce faire avec BackgroundWorker
consiste à appeler la méthode ReportProgress
du worker (assurez-vous que WorkerReportsProgress = true
). Cette méthode déclenchera l'événement ProgressChanged
, qui sera géré par le thread d'interface utilisateur.
Donc, si vous voulez ajouter des éléments à un contrôle ListBox
, par exemple, sur la base des travaux de votre BackgroundWorker
est en train de faire, appelez ReportProgress
et passer toutes les données dont vous avez besoin en tant que paramètre. Ces données seront stockées dans la propriété UserState
du ProgressChangedEventArgs
fourni par l'événement. Votre gestionnaire d'événements peut prendre ces données et remplir le ListBox
avec.
Alternativement, vous pouvez tout ajouter à la fin en gérant l'événement RunWorkerCompleted
du worker. Si le travail effectué par votre travailleur ne prend pas tout ce temps, c'est souvent préférable car c'est plus simple et cela réduit l'interface utilisateur (avec moins de mises à jour discrètes à effectuer).
Si vous souhaitez ajouter l'élément à la liste dans l'événement DoWork, vous devez "invoquer" les contrôles.
Ce n'est pas vraiment la manière recommandée de le faire. –
Vous pouvez déclencher un événement qui effectue le travail d'ajout d'éléments à la liste, comme indiqué dans l'exemple ci-dessous à l'aide de ListView.
ListViewItem _listViewItem;
private void BackgroundWorkerDoWork(object sender, DoWorkEventArgs e)
{
//your loop to get list view item
_listViewItem = new ListViewItem(mytext) {tag = mytagobject);
_listViewItem.SubItems.Add(mysubitemtext);
Invoke(new EventHandler(UpdateUiEvent), new[] { sender, e });
}
void UpdateUiEvent(object sender, EventArgs e)
{
listView1.Items.Add(_listViewItem);
}
- 1. BackgroundWorker
- 2. Annuler backgroundworker
- 3. Powershell Backgroundworker
- 4. BackgroundWorker et Progressbar.Show()
- 5. BackgroundWorker et WebBrowser Control
- 6. vb.net - backgroundworker & listview.items.add()
- 7. WPF BackgroundWorker Execution
- 8. Gestionnaires d'événements BackgroundWorker
- 9. Besoin d'aide sur Backgroundworker
- 10. C# BackgroundWorker Discussion Problème
- 11. BackgroundWorker RunWorkerCompleted, événement
- 12. BackgroundWorker problèmes dans Siverlight
- 13. BackgroundWorker Thread - C#
- 14. .NET BackgroundWorker et SQLTransactions
- 15. C# BackgroundWorker culture
- 16. BackgroundWorker Aide requise
- 17. Trigger Backgroundworker Evénement terminé
- 18. problème avec BackgroundWorker
- 19. BackgroundWorker Thread dans IIS7 - FAIL!
- 20. Silverlight: Storyboard vide vs BackgroundWorker
- 21. erreur de manipulation avec BackgroundWorker
- 22. GTK équivalent à BackgroundWorker (MonoDevelop)
- 23. Backgroundworker: exception lors de l'annulation
- 24. Différence entre BackgroundWorker et System.Threading.Thread
- 25. C# backgroundWorker signale une chaîne?
- 26. BackgroundWorker doit toujours appeler Invoke?
- 27. BackgroundWorker a terminé l'événement - quel fil?
- 28. BackgroundWorker OnWorkCompleted lève l'exception de thread-thread
- 29. BackgroundWorker Ne fonctionne pas dans VSTO
- 30. Annulation de BackgroundWorker dans le thread
Veuillez donner plus d'informations dans cette question. Il est possible de déterminer ce que vous demandez, mais c'est difficile. –
Par liste voulez-vous dire l'objet de collection 'System.Collections.Generic.List'? –