Привязка данных и блокировка списка - PullRequest
2 голосов
/ 23 декабря 2010

Я пишу (мое первое) приложение WPF, которое ищет в Интернете и отображает ссылки в ListBox.Чтобы ускорить все, я использую несколько потоков, чтобы загрузить ссылки.Тем не менее, я столкнулся с интересной многопоточной дилеммой:

Предположим, у меня есть поток пользовательского интерфейса, а затем появились еще 2 потока для загрузки ссылок.Теперь темы загрузки добавляют ссылки на List, называемый LinkList, с которым связан мой ListBox.Если Thread1 обновляет LinkList, тогда поток пользовательского интерфейса пытается выполнить итерацию по LinkList, чтобы повторно связать ListBox.Если во время итерации потока пользовательского интерфейса поток 2 пытается добавить элементы в LinkList, в потоке пользовательского интерфейса возникает исключение, поскольку вы не можете добавить элемент в список во время итерации.Я хочу ждать, пока все потоки не вернутся, чтобы связать ListBox, так как это означает, что пользователь должен ждать долго.Есть ли способ справиться с этим?Можно ли как-то поместить lock вокруг итерации привязки в потоке пользовательского интерфейса?

1 Ответ

1 голос
/ 23 декабря 2010

INotifyCollectionChanged не является поточно-ориентированным (unline INotifyPropertyChanged), поэтому вместо добавления элементов в поток пользовательского интерфейса следует использовать диспетчер при добавлении элементов в LinkList из рабочего потока

var objectToAdd = ...
Dispatcher.Invoke(new Action(() =>
{
    LinkList.Add(objectToAdd);
})); 
...