我已經使用了BackgroundWorkers很多,但我從未遇到過這個問題。我的程序分析了邏輯分析儀產生的數據包的輸出,其中有數千個。爲了防止在我的表單中更新ListView(我之前報告發現的每一個,並且表單完全沒有響應),我在一個通用列表(列表<Packet>)中收集BackgroundWorker中的數據包並且然後報告發現有n個數量(當前爲250),或發生異常或完成時。C#:如何解決BackgroundWorker進度報告回調中的「集合被修改」?
當我遍歷列表時,發生在我的回調中的問題<數據包>我收到InvalidOperationException,其中「Collection was modified」錯誤。我沒有觸及foreach中的集合(我正在添加到另一個集合中,但我沒有看到任何理由可能會修改我正在迭代的集合 - 並且將其註釋掉並不能解決問題。)甚至試圖鎖定e.UserState,將e.UserState存儲到本地範圍列表<Packet>並鎖定,似乎沒有任何工作。
下面是我的回調方法的代碼:
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");
}
你在評論什麼? >>我沒有觸及foreach中的集合(我正在添加到另一個集合中,但我沒有看到任何理由可以修改我正在迭代的集合 - 加上評論它並不能解決問題。)< < – Les 2010-10-02 12:23:22
(列表<數據包)e.UserState是每次調用的同一個列表,還是每次都是新的? – Les 2010-10-02 12:51:28