У меня есть UserControl
, который был построен по шаблону MVVM с открытой функцией, позволяющей другим приложениям отправлять «команды» для элемента управления. Команды в этом случае strings
. Я пытаюсь найти способ остановить зависание графического интерфейса при отправке большого количества команд за короткий промежуток времени. Каждая команда должна ждать окончания последней.
Большинство этих команд работают с сторонним элементом управления картой, который отображается в виде основного элемента управления.
Поток идет так:
- Приложение отправляет командную строку для управления.
- Элемент управления вызывает функцию разбора для разбора строки.
- После завершения анализа в зависимости от команды вызывается определенный класс.
- Происходит то, что происходит, т.е. создается модель, обновляется
ObservableCollection
, обновляется элемент управления картой и т. Д.
Вот пример:
Контроль пользователя:
///The code behind for the control
public partial class MainControl : UserControl
{
public MainControl()
{
InitializeComponent();
}
//Other apps call this function
public void ExecuteCommand(string command)
{
CommandParser.StartParse(command);
}
}
Класс для разбора команд:
//Handles parsing a string command and calling the right class
public static class CommandParser
{
public static void StartParse(string command)
{
//parses the command into a string array to hold different parts
DoCommand(parsedCommand);
}
private static void DoCommand(string[] command)
{
switch(command[0])
{
case "addpoint":
AddCommand.AddObj(command);
break;
case "createstyle":
CreateCommand.CreateObj(command);
break;
}
}
}
Два класса, которые принимают проанализированную команду и что-то делают:
//Adds objects to the third party map control
public static class AddCommand
{
public static void AddObj(string[] command)
{
//Adds a point to the third party map control
MapControl.AddPoint(new Point(90, -90)); //just an example
}
}
//Creates model objects to add to observablecollections in viewmodels
public static class CreateCommand
{
public static void CreateObj(string[] command)
{
//create a model
//get the correct viewmodel
viewModel.StylesCollection.Add(styleModel); //StylesCollection is an ObservableCollection
}
}
Очень простой пример, но должен показать поток всего. Итак, представьте, что вы получили несколько тысяч команд; Создание модели выполняется быстро, но поскольку элемент управления карты (который является частью графического интерфейса пользователя) обновляется каждый раз, или изменяется ObservableCollection
(с которым связан элемент источника элемента управления), графический интерфейс зависает при получении и делать все эти команды.