Наша группа прочитала широко цитируемую статью 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 ……) Это замедляет отображение журнала, а анимации по-прежнему капризны.
Существует ли готовое решение для такой распространенной проблемы (производительность пользовательского интерфейса и фоновые задачи)?