Тяжелые фоновые потоки TPL создают лаги в пользовательском интерфейсе WPF - PullRequest
4 голосов
/ 16 декабря 2011

У меня есть WPF-приложение, которое использует несколько фоновых потоков для предварительной компиляции LINQ-запросов и предварительного кеширования некоторых значений, которые понадобятся позже.TPL используется для запуска этих задач:

var newTask = new Task(taskAction, myCancelToken, TaskCreationOptions.LongRunning);
newTask.Start();

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

Итак, что может быть разумным способом сгладить пользовательский интерфейс.Проведя исследования, я обнаружил, что не следует придавать нитям особые приоритеты.Другие подразумевают, что частое использование Thread.Sleep () было подходящим способом, который мне кажется немного устаревшим и хакерским.

Есть ли дополнительные способы, о которых я не знаю?Есть ли реальные недостатки в приоритетности потоков (что невозможно через TPL напрямую, afaik)?

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

Ответы [ 2 ]

1 голос
/ 16 декабря 2011

Что касается расстановки приоритетов задач, вы можете сделать что-то вроде http://blogs.microsoft.co.il/blogs/bnaya/archive/2011/01/29/how-to-schedule-task-on-different-thread-priority.aspx

Но явное изменение приоритета потока в AFAIK не рекомендуется

0 голосов
/ 16 декабря 2011

10 потоков слишком много, скажем, на 4-ядерном компьютере. Если они связаны с вычислениями, как запросы предварительной компиляции, они все будут бороться за процессорное время и приведут к зависанию всего компьютера.

Я предлагаю вам использовать Environment.ProcessorCount, чтобы узнать, сколько ядер доступно, и запускать только (это число - 1) потоки за раз. Вы можете расставить приоритеты, какая работа выполняется первой и поставить в очередь остальные как продолжение.

Это оставит ядро ​​свободным для обслуживания вашего потока пользовательского интерфейса и должно заставить приложение снова реагировать.

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