Технически проблема не в том, что вы обновляете ObservableCollection из фонового потока.Проблема заключается в том, что при этом коллекция вызывает событие CollectionChanged в том же потоке, который вызвал изменение - это означает, что элементы управления обновляются из фонового потока.
Для заполнения коллекции из фонаВ то время как элементы управления привязаны к нему, вам, вероятно, придется создать собственный тип коллекции с нуля, чтобы решить эту проблему.Хотя есть более простой вариант, который может сработать для вас.
Публикация вызовов Add в потоке пользовательского интерфейса.
public static void AddOnUI<T>(this ICollection<T> collection, T item) {
Action<T> addMethod = collection.Add;
Application.Current.Dispatcher.BeginInvoke( addMethod, item );
}
...
b_subcollection.AddOnUI(new B());
Этот метод будет возвращен немедленно (до того, как элемент фактически добавитсязатем) в потоке пользовательского интерфейса, элемент будет добавлен в коллекцию, и все должны быть счастливы.активностьБолее эффективное решение будет объединять несколько элементов и периодически публиковать их в потоке пользовательского интерфейса, чтобы не вызывать потоки для каждого элемента.
Класс BackgroundWorker реализует шаблонэто позволяет вам сообщать о прогрессе с помощью метода ReportProgress во время фоновой операции.Ход выполнения сообщается в потоке пользовательского интерфейса через событие ProgressChanged.Это может быть другой вариант для вас.