Загрузка анимации Замораживание при возврате вызова веб-службы - PullRequest
0 голосов
/ 30 июня 2009

У меня есть приложение Silverlight 2 с сообщением «Загрузка данных ...», которое содержит анимацию. Когда веб-служба возвращает данные и данные загружаются в наблюдаемую коллекцию - анимация останавливается (это может занять несколько секунд, пока загружаются данные, и создается впечатление, что что-то может быть не так.)

Наблюдаемая коллекция, привязанная к данным для элемента управления в представлении.

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

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

спасибо Michael

Ответы [ 4 ]

1 голос
/ 28 июля 2009

Я не знаю, получил ли ты ответ на это или нет, но здесь я иду.

Попробуйте использовать BackgroudWorker, чтобы поместить туда инструкции для работы в тяжелых условиях.

Вот очень хороший пример: http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

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

0 голосов
/ 01 июля 2009

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

Я думаю, что вы можете настроить шаблон индикатора выполнения довольно простым способом, а также добавить сообщение Загрузка данных ... в виде TextBlock. У меня также есть сообщение Loading ... над элементом управления Progress.

0 голосов
/ 02 июля 2009

Вы правы, говоря, что обратный вызов происходит в потоке пользовательского интерфейса. Чтобы решить вашу проблему, вы можете сделать ее асинхронной, чтобы она происходила в фоновом потоке, а затем создать новую наблюдаемую коллекцию и заменить существующую за одну операцию. Например:

private SynchronizationContext _uiThread = SynchronizationContext.Current;

public void UpdateUIAsynchronously(ICollection<Data> data)
{
ObservableCollection<Data> temp = new ObservableCollection<Data>();
foreach(Data currentData in data)
{
temp.Add(currentData);
}

_uiThread.Post(delegate(object o) { myDataGrid.ItemsSource = temp }, null);
}

В своей разработке я обнаружил, что для DataGrid я могу просто очистить и добавить новые элементы в поток пользовательского интерфейса без снижения производительности. Может быть, вы могли бы изменить свой код пользовательского интерфейса?

0 голосов
/ 30 июня 2009

Ваша анимация не работает, потому что ваш JS имеет дело с возвращенными данными. (Однопоточный браузер.)

Решение: ваш загрузчик JS должен периодически уступать браузеру, чтобы браузер мог выполнять анимацию.

См. Мой SO-ответ Почему jQuery Ajax так медленно работает в IE7? , чтобы узнать подробнее, как это сделать.

...