2010-08-25 2 views
1

Нашей группы читать широко цитируются статьи http://blog.quantumbitdesigns.com/2008/07/22/wpf-cross-thread-collection-binding-part-4-the-grand-solution/ и спрашивает, если любой из вас может помочь с нашей проблемой:WPF: Запуск задач без вмешательства Animations Performance

Член команды имеет приложение WPF, который имеет анимацию работает. Проблема в том, что выполнение фоновых задач даже в разных потоках приводит к дрожанию анимации. Проблема в том, что создание регулярного потока с низким приоритетом не помогает, так как эти задачи в конечном итоге должны отображать данные в элементах пользовательского интерфейса. Например: У нас есть элемент управления, который показывает журналы того, что делает приложение. Существует отдельная DLL, которая имеет метод GetLogs, который возвращает список последних журналов. Мы активируем его, используя таймер, и каждые 500 м. Приложение получает новый список, который может содержать до 10000 записей. Пользовательский контроль журнала - это просто ListView, привязанный к ObservableCollection. Наше требование состоит в том, чтобы добавить каждую запись из списка, который мы получаем в Наблюдаемую коллекцию. Мы также проверяем, что коллекция не превысила предел, который мы ему дали (скажем, 100000 записей). Если он превышает предел, мы удаляем первые 10000 записей.

Теперь это можно сделать только в объекте диспетчера пользовательского интерфейса, поэтому наилучшим близким решением является использование BackGroundWorker. Но этот поток не имеет низкого приоритета, и приоритет не может быть установлен там. Мы задаемся вопросом, поможет ли это, поскольку мы понимаем, что поток отправляет элементы интерфейса с помощью метода Dispatcher.Invoke.

Так что для меня действительно параллельна добавлению каждой строки в наблюдаемую коллекцию с помощью Dispatcher.BeginInvoke (ThreadPriority.Low ......) Это замедляет отображение журнала, а анимация по-прежнему капризна.

Есть ли из-за проблем решение проблемы (производительность пользовательского интерфейса и фоновые задачи)?

+0

Является ли неустойчивое поведение только при взятии данных из фоновой нити и представлении ее в пользовательском интерфейсе? – Nate

+0

Какова природа анимации? – Jay

+0

@Jay: индикатор прогресса –

ответ

1

Here is the link to BackgroundWorkerPrioritized Component, который является базовой реализацией .NET Framework, улучшен с установкой приоритета потока путем передачи параметра конструктора.

Надеюсь, это поможет.

+0

спасибо, это выглядит полезным –

0

Я не уверен, что вы делаете в фоновом режиме, но каждый раз, когда вы вызываете Dispatcher.BeginInvoke, вы делаете что-то обратно в основной теме. В вашем случае каждые полторы секунды вы делаете 10000 вещей в основном потоке пользовательского интерфейса. Начиная с вашего обновления ObservableCollection, вы также поднимаете событие каждый раз, когда вы добавляете/удаляете что-то.

В этом случае вместо использования наблюдаемой коллекции я бы просто использовал список. Создайте список в фоновом потоке, затем привяжите его к списку с одним вызовом Dispatcher.BeginInvoke.

 Смежные вопросы

  • Нет связанных вопросов^_^