2010-09-03 5 views
-1

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

+2

Veuillez donner plus d'informations dans cette question. Il est possible de déterminer ce que vous demandez, mais c'est difficile. –

+0

Par liste voulez-vous dire l'objet de collection 'System.Collections.Generic.List '? –

Répondre

8

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).

0

Si vous souhaitez ajouter l'élément à la liste dans l'événement DoWork, vous devez "invoquer" les contrôles.

Look here for more details.

+1

Ce n'est pas vraiment la manière recommandée de le faire. –

0

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); 
}