Диспетчер WPF, рабочий Background и много боли

Хорошо это может быть действительно просто, но все, что я пробую просто, кажется, врезается в кирпичную стену.

У меня есть модель представления с двумя свойствами, которые связываются с моей формой 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);
                            })
                          );

но это все еще бросает ту же перекрестную ошибку потока.

Я не очень хорош с поточной обработкой, таким образом, я понятия не имею, что я мог бы делать неправильно, кто-то сможет дать мне руку с этим?

6
задан Nathan W 10 February 2010 в 23:50
поделиться

2 ответа

посмотрите здесь информацию о том, как другие люди создали потокобезопасные наблюдаемые коллекции (чтобы вам не пришлось это делать).

5
ответ дан 10 December 2019 в 02:47
поделиться

Поскольку код для обновления коллекции вызывается из фонового потока, Dispatcher.CurrentDispatcher - неправильный диспетчер. Вам необходимо сохранить ссылку на диспетчер пользовательского интерфейса и использовать этот диспетчер при планировании обновления.

4
ответ дан 10 December 2019 в 02:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: