У меня возникла проблема с использованием нескольких диспетчеров пользовательского интерфейса для изменения списка, привязанного к пользовательскому интерфейсу. Метод с выходом только при попадании в первый диспетчер. Если я оберну весь метод в диспетчер, он сработает, но у меня есть другое решение, но я не уверен, что оно подходит:
По сути, у меня есть сокет, который в бесконечном цикле прослушивает сетевые команды с мультимедийного устройства. Когда он находит его, он вызывает ProcessCommand.
Эта функция вызывает один из 50+ методов для обработки определенных команд. Эти функции хранят внутреннее состояние, но в основном вызывают события, на которые может подписаться мое основное приложение, поэтому оно знает, когда что-то вроде изменения громкости, и я могу обновить пользовательский интерфейс.
Они работают довольно хорошо, за исключением одного случая, отмеченного в начале, когда мне нужно изменить объект состояния, который связан с использованием нескольких диспетчеров в одном и том же методе, и он не работает, и кажется, что работает перенос метода в один большой диспетчер.
Другое решение, которое я нашел, - запустить ProcessCommand, работающий в фоновом прослушивателе сокета в диспетчере пользовательского интерфейса, то есть:
CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
ProcessCommand(command);
});
Затем это будет просачиваться во все 50+ отдельных методов ProcessCommandXYZ, а также в мое основное приложение, где я подписываюсь на эти события на нескольких страницах. В настоящее время мне приходится использовать диспетчер пользовательского интерфейса на каждом из них, поэтому что-то вроде:
Фоновая задача прослушивателя сокетов > {DispatcherUI ProcessCommand} > ProcessVolumeCommand > Raise OnVolumeChangedEvent > Пользовательский интерфейс обновлений подписчика
Сделал бы это так, чтобы мне не нужно было помещать каждого подписчика событий в диспетчер, но, что наиболее важно, устраняет проблему, с которой я сталкиваюсь с несколькими диспетчерами в одном методе:
Правильное использование Dispatcher в случае обновления пользовательского интерфейса
Это кажется хорошим решением?