WPF: запуск задач без вмешательства в производительность анимации - PullRequest
1 голос
/ 25 августа 2010

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 25 августа 2010

Вот ссылка на BackgroundWorkerPrioritized Component , который представляет собой базовую реализацию .NET Framework, улучшенную с помощью установки приоритета потока путем передачи параметра конструктора.

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

0 голосов
/ 25 августа 2010

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

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

...