Хорошо это может быть действительно просто, но все, что я пробую просто, кажется, врезается в кирпичную стену.
У меня есть модель представления с двумя свойствами, которые связываются с моей формой WPF:
bool IsWorking {get;set;}
ObservableCollection<OtherViewModel> PendingItems {get;set;}
У меня есть метод, который я называю для выборки некоторых новых незаконченных объектов от перспективы, однако я также, что показать своего рода достижения по форме (вращающий индикатор выполнения), видимость индикатора выполнения связывается со свойством IsWorking на ViewModel, и сетка связывается с набором PendingItems.
Я хотел бы смочь установить IsWorking на истинный, таким образом, UI может показать индикатор выполнения, выполнить работу в фоновом режиме и затем установить IsWorking на ложь после того, как это закончено так, индикатор выполнения уходит.
Я создал backgroudworker что-то вроде этого:
worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
worker.RunWorkerAsync();
Теперь worker_DoWork называет метод, который идет выборки незаконченные объекты и добавляет их к набору PendingItems, все работает в фоновом режиме, UI является все еще быстро реагирующим, но я добираюсь, нормальный крест распараллелил ошибку при попытке добавить к набору. Я перенес код, который изменяет набор в вызове диспетчера:
// Update to show the status dialog.
Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.Render,
new Action(delegate()
{
this.PendingItems.Add(\\Blah);
})
);
но это все еще бросает ту же перекрестную ошибку потока.
Я не очень хорош с поточной обработкой, таким образом, я понятия не имею, что я мог бы делать неправильно, кто-то сможет дать мне руку с этим?
посмотрите здесь информацию о том, как другие люди создали потокобезопасные наблюдаемые коллекции (чтобы вам не пришлось это делать).
Поскольку код для обновления коллекции вызывается из фонового потока, Dispatcher.CurrentDispatcher - неправильный диспетчер. Вам необходимо сохранить ссылку на диспетчер пользовательского интерфейса и использовать этот диспетчер при планировании обновления.