Моя проблема очень похожа на упомянутую проблему in this post. По сути, Invoke висит (только при запуске вне отладчика). Я думаю, что это связано с вложением вызовов Invoke.Dispatcher.Invoke висит, когда ListCollectionView контролирует коллекцию
Я использую MVVM Light, и я пробовал две реализации многопоточного дружественного ObservableCollection - I've used this one for ages и недавно попытался упростить до this version. Последнее казалось лучше, пока оно не сработало с «принадлежащим этому потоку» InvalidOperationException. И, глядя на мою копию первого, похоже, что я проглатываю исключения. Капризный капризный. Это послужило бы причиной того, что собственность изменила «неудачи».
Это поток операций, который является хлопотным. Почти во всех точках я пробовал перемещать вещи в нить ui или перемещать их из нити ui. Мне удалось отложить зависание, но за счет имущества изменились сбои.
- запрос приходит из нити через WCF к первичному ViewModel
- Запрос разобранного (я пробовал и на фоновом потоке и вызов основному потоку) объекта
- ReportEntry извлекается из базы данных
- Отображается сообщение, отправленное в пользовательский интерфейс через Messenger, запрашивающий диалоговое окно редактирования.
- Главное окно обрабатывает сообщение, вызывается IEditableObject.BeginEdit и отображается диалог редактирования.
- По возвращении вызывается действие обратного вызова Messenger.
- Теперь ReportEntry готов к добавлению в соответствующую коллекцию. В MainViewModel есть коллекция FileViewModels, каждая из которых имеет коллекцию ReportViewModels.
- Модели ReportViewModels обычно создаются с помощью FileViewModel, наблюдая за событиями CollectionChanged коллекции FileModel. Я пробовал обходить это, чтобы избежать больше гнездования, но безрезультатно.
Именно в этот момент, что мое приложение либо виснет (если я в первую очередь операционный в основном потоке) или CollectionChanged события из строя вследствие нарезания резьбы, в зависимости от того, как я переехал вещи между потоками.
Когда приложение зависает, оно находится в ожидании, вызванном из Invoke, в соответствии с отладчиком, который я прикрепляю.
О, и я попытался изменить различные Invoke's для BeginInvoke.
Резюмируя мне нужен ответ на один из этих двух вопросов:
- Что ставит мой UI нить в режим ожидания таким образом, что Invoke висит?
- Существует ли лучший класс ObservableCollection для использования?
Спасибо за раздумье.
UPDATE
Ну, я не знаю, нужно ли удалять этот вопрос и начать заново или что. Похоже, что проблема связана с ListCollectionView, который я использовал для фильтрации ReportEntry. Мой FileViewModel имеет
public ListCollectionView FilteredReports {get; private set;}
инициализирован следующим образом:
FilteredReports = new ListCollectionView(Reports);
FilteredReports.Filter = FilterFunction;
Когда я удалить FilteredReports, нет более повешение. Раздражающе, DataGrid Я использую это представление, поскольку ItemSource for находится в DataTemplate, поэтому перемещение фильтра на мое представление также нетривиально. Итак, любая причина, по которой ListCollectionView висит на обновлениях коллекции?
Ну, к сожалению, у меня так много исключений на данный момент, что он трудно запускать, когда ломается бросок. На данный момент я работал над проблемой (пытаясь получить сборку до конца года), но я ожидаю вернуться и снова попробовать маршрут viewmodel. Это будет мой первый шаг отладки. – Thomas
Никаких исключений, не знаю, что происходит. Однако это уже не Гейзенбуг. Он просто висит. Кажется, я как бы затормозил приложение. Я бы подумал, что мой CollectionView должен вести себя по существу так же, как тот, который был создан моим набором инструментов wpf toolkit datagrid. – Thomas