Мозговой штурм: как реализовать фоновые вычисления в Silverlight? - PullRequest
1 голос
/ 03 августа 2011

В настоящее время я работаю над приложением Silverlight 4.0, которое отображает около 13 000 строк в элементе управления DataGrid.Один элемент содержит около 40 строковых свойств и одно целочисленное.

На странице, содержащей эту сетку, находится панель, на которой пользователь может устанавливать различные веса.После нажатия кнопки «Обновить» Silverlight должен выполнить некоторые вычисления в зависимости от этих настроек.

Во время расчета интенсивно (и необходимо) использовать отражение для получения значений свойств String.Наконец, в результате вычисляется оценка и записывается в целочисленное поле.Это необходимо сделать для каждого из 13 000 объектов.

В настоящее время в качестве временного решения я использую экземпляр BackgroundWorker и диспетчер гридов (чтобы войти в поток пользовательского интерфейса и получить доступ к нему).свойство ItemsSource в Grid), выполните итерацию по каждому элементу и рассчитайте оценку.Этот процесс занимает около 3 минут и это слишком долго, так как пользователь не хочет ждать более нескольких секунд.К сожалению, PLinq & Co не включены в Silverlight 4, и даже моя попытка реализовать многопоточное решение для этого не удалась, потому что мне нужно вернуться к потоку пользовательского интерфейса (-> Dispatcher), чтобы обновить каждый элемент (который реализует INotifyPropertyChanged)который направляется в Grid) и для доступа к ItemsSource.Таким образом, даже при использовании полупараллельного решения оно не очень быстрое из-за зависимости от потока пользовательского интерфейса.

Дополнительно к простому отображению данных пользователь должен иметь возможность фильтровать данные, которые не поддерживаются.по умолчанию.Поэтому я создал класс, похожий на этот , который реализует интерфейс ICollectionView.

У вас есть идея или предложение, что я мог бы попробовать?

Заранее спасибо!

1 Ответ

2 голосов
/ 03 августа 2011

Мое предложение: не используйте INotifyPropertyChanged для рассматриваемых объектов или используйте ObservableCollection<T>. Вместо этого используйте простой класс для представления строки и простой старый List<T> для хранения набора. Используйте объект CollectionViewSource в качестве DataGrid.ItemsSource и разрешите сортировку.

При пересчете попробуйте сначала. Переключиться на фоновый поток. Создайте новый List<T>, инициализируя его емкость равной количеству List<T>, которое в настоящее время заполнено. Перечислите текущий List<T> для выполнения пересчетов, а затем добавьте в новый List<T>. Когда все обработано, переключитесь на поток пользовательского интерфейса и просто назначьте новый List<T> свойству CollectionViewSource.Source.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...