Я использую визуальный контроль в своем проекте, который из библиотеки, к которой у меня нет источника.
Требуется слишком много времени, чтобы обновить (примерно 200 мс) для хорошей реакции интерфейса с тремя из этих элементов управления на экране одновременно. (Мне может потребоваться обновить все три сразу, что оставляет мой пользовательский интерфейс застрял на ~ 600 мс, пока они все думают).Запуск WPF-управления в другом потоке
Я прочитал несколько сообщений о TaskSchedulers и начинаю исследовать функции задачи Parallel как способ запуска каждого из этих элементов управления в своем потоке. Платформа будет многоядерной, поэтому я хочу воспользоваться одновременной обработкой.
Проблема заключается в том, что я даже не знаю, что я не знаю о том, как идти об этом, хотя ..
Есть ли подходящий шаблон дизайна для запуска элемента управления в отдельном потоке из основной поток пользовательского интерфейса в WPF?
В частности: это элемент управления третьей стороной, что при заданном новом местоположении или уровне масштабирования слишком много времени для перерисовки (~ 200 мс). Возможно, три из этих обновлений не превышают 4 Гц - очевидно, что они не будут поддерживать вверх.
Я инкапсулировал элемент управления WPF в usercontrol и должен запускать каждый экземпляр в своем собственном потоке, сохраняя при этом вход пользователя (щелчки мыши, например).
ОБНОВЛЕНИЕ: В то время как я чувствую себя вокруг решения, я реализовал следующее до сих пор.
My main (UI) thread создает поток, который создает новое окно, содержащее данный элемент управления, и находит его в правильном положении (так что это выглядит как обычный контроль).
_leftTopThread = new Thread(() =>
{
_topLeftMap = new MapWindow()
{
WindowStartupLocation = WindowStartupLocation.Manual,
Width = leftLocation.Width,
Height = leftLocation.Height,
Left = leftLocation.X,
Top = leftLocation.Y,
CommandQueue = _leftMapCommandQueue,
};
_topLeftMap.Show();
System.Windows.Threading.Dispatcher.Run();
});
_leftTopThread.SetApartmentState(ApartmentState.STA);
_leftTopThread.IsBackground = true;
_leftTopThread.Name = "LeftTop";
_leftTopThread.Start();
Где CommandQueue
является Thread-safe BlockingCollection очереди для отправки команд на карте (перемещение местоположение и т.д.).
Проблема теперь, что я могу либо
- есть ввод данных пользователем в связи с
System.Windows.Threading.Dispatcher.Run()
вызова - или блока на CommandQueue, прослушивание команд, посылаемых в главном потоке
I не может открутить ожидание команд, потому что он впитал бы весь мой процессор потока!
Возможно ли заблокировать и?
управления Все WPF должны быть обновлены в потоке пользовательского интерфейса. Тем не менее, мы можем помочь, если вы предоставите некоторые сведения об используемом элементе управления и любом коде, который вы написали, чтобы обновить/заполнить его. –
@CameronPeters, вы уверены, что не может быть более одного «потока пользовательского интерфейса»? – svick
В настоящее время у меня несколько потоков «UI» (благодаря Threading.Dispatcher.Run()), но они не могут заблокировать их, ожидая сигналов. – DefenestrationDay