Рекомендации по работе со многими потоками / задачами в приложении WPF - PullRequest
0 голосов
/ 17 февраля 2019

В моем приложении WPF у меня много потоков, работающих в моем бэкэнде.Я создаю их с помощью следующего синтаксиса:

_longRunningThread = new Thread(WorkerOperation);
_longRunningThread.Start();

Или

            Task.Run(() =>
            {
                   //long running operations
            }

А затем во внешнем интерфейсе моего приложения WPF у меня есть поток пользовательского интерфейса, который должен обновить мой пользовательский интерфейсэлементы (видимость, изменить цвет, изменить на Включить / Отключить, добавить / удалить элементы из сетки данных и т. д.).

Потоки / задачи в обработчиках фоновых событий, в которых зарегистрирован пользовательский интерфейс.Когда вызывается прослушиватель пользовательского интерфейса, я нахожусь в контексте вызывающего потока / задачи (который был вызван в серверной части), поэтому, когда мне нужно обновить элементы пользовательского интерфейса (в прослушивателе пользовательского интерфейса), я долженпереключение контекста в поток пользовательского интерфейса.Я делаю это с помощью следующего синтаксиса:

Application.Current.Dispatcher.BeginInvoke(UpdateUiElementsMethod);

Насколько я понимаю, это помещает UpdateUiElementsMethod в очередь потока пользовательского интерфейса, а затем (если я не обрабатываю приоритеты для очереди),it синхронно выполняет действия, которые были добавлены в очередь.

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

Application.Current.Dispatcher.Invoke

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

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

Я в основном ищу какое-то решение, прежде чем начать работу по сокращению задач/ threads в моем приложении ИЛИ уменьшая количество переключений контекста между внутренними потоками и потоком пользовательского интерфейса.

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