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);
}
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'? –