Как бы я перебрать коллекцию в отдельном потоке и отобразить текущий элемент в связанном ListBox? - PullRequest
0 голосов
/ 25 августа 2010

У меня ListBox, связанный с ObservableCollection. Каждый элемент в коллекции обозначает отдельный шаг с методом для выполнения этого шага. То, что я хотел бы сделать, это сделать цикл BackgroundWorker через коллекцию, запустить метод действия каждого элемента и отразить текущий шаг в ListBox.

Моя первая итерация не использовала многопоточность и должна была просто запустить шаг. Теперь я создал ListCollectionView, установил его для представления данных в ObservableCollection и привязал к нему объект ItemsBource ListBox вместо ObservableCollection. Я заметил, что выполнение шагов все еще блокирует обновления потока пользовательского интерфейса, хотя я явно увеличиваю CurrentItem.

Я хочу использовать ListCollectionView внутри BackgroundWorker, но большинство примеров, которые я нахожу, написаны при условии, что вы изменяете содержимое или сортируете список. Я не хочу делать это; Я просто хочу увеличить CurrentItem для каждой итерации. Я предполагаю, что простая ссылка на него не даст мне слишком далеко, поскольку она связана с элементами в потоке пользовательского интерфейса, и компилятор будет жаловаться. Любые мысли или указатели будут высоко оценены.

Ответы [ 2 ]

1 голос
/ 25 августа 2010

Вы не должны видеть никаких жалоб от компилятора, но вы будете получать исключения во время выполнения, если попытаетесь обновить что-либо, что вызывает INotifyPropertyChanged PropertyChange из фонового потока. Есть несколько способов обойти это. Вы можете использовать Dispatcher.Current.Invoke, чтобы просто делать обновления внутри вашего метода DoWork. Вы можете попытаться настроить что-либо с помощью обработчика ProgressChanged (работает в вызывающем потоке) и вызывает ReportProgress для каждого завершенного шага. Или вы можете выполнить обновления в обработчике RunWorkerCompleted (также выполняется в вызывающем потоке) и, возможно, использовать серию последовательных вызовов BackgroundWorker, которые запускаются из завершенного обработчика предыдущего (это может стать грязным, если вы не управляете шагами через общая очередь или что-то подобное).

0 голосов
/ 25 августа 2010

Вам необходимо проверить Переплетная коллекция WPF - Часть 4. Великое решение и источник, который, я думаю, находится на QuantumBitDesigns.Core

Это позволяет обновлять список из другого потока и автоматически отображать изменения в привязываемой наблюдаемой коллекции.

Multiple threads updating an Observable Collection
Рисунок. Демонстрационное приложение отображает несколько обновлений одной коллекции ObservableCollection

Я использовал это в нескольких проектах с фантастическими результатами.

...