J'ai beaucoup utilisé BackgroundWorkers, mais je n'ai jamais rencontré ce problème auparavant. Mon programme analyse la sortie d'un analyseur logique produisant des paquets, dont il existe des milliers. Pour éviter de trop retarder la mise à jour de ListView dans mon formulaire (je signalais précédemment chacun comme il a été trouvé, et le formulaire ne répondait pas), je rassemble les paquets dans BackgroundWorker dans une liste générique (Liste <Packet>) et puis en indiquant que, lorsque n sont trouvés (actuellement 250), ou lorsqu'une exception se produit, ou quand elle se termine.C#: Comment puis-je résoudre "Collection a été modifiée" dans un rappel de rapport d'avancement BackgroundWorker?
Le problème se produit dans mon rappel lorsque je suis itérer sur la liste <Paquet> Je reçois une exception InvalidOperationException, avec l'erreur «Collection was modified». Je ne touche pas à la collection à l'intérieur de foreach (j'ajoute à une autre collection, mais je ne vois pas pourquoi cela pourrait modifier la collection que je suis en train d'itérer - et comment le résoudre ne résout pas le problème.) J'ai même essayé de verrouiller le e.UserState, en stockant le e.UserState dans une portée locale Liste <Packet> et le verrouillage, rien ne semble fonctionner.
est ici le code de ma méthode de rappel:
void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar.Value = e.ProgressPercentage;
packetsListView.SuspendLayout();
lock ((List<Packet>)e.UserState)
{
foreach (Packet packet in (List<Packet>)e.UserState)
{
packets.Add(packet);
ListViewItem item = new ListViewItem(string.Format("{0}ns", Math.Round(packet.StartSampleNumber * 41.666667)));
item.Tag = packet;
item.SubItems.Add(new ListViewItem.ListViewSubItem(item, packet.Description));
packetsListView.Items.Add(item);
}
}
packetsListView.ResumeLayout();
statusLabel.Text = string.Format("Analyzing...found {0} {1}", packetsListView.Items.Count, packetsListView.Items.Count == 1 ? "packet" : "packets");
}
Que faites-vous remarquer? >> Je ne touche pas à la collection à l'intérieur du foreach (j'ajoute à une autre collection, mais je ne vois pas pourquoi cela pourrait modifier la collection que je suis en train d'itérer - et commenter ne résout pas le problème.) < < – Les
Est-ce que (List
Les