2016-01-06 6 views
2

Привет, ребята, я перехожу один из моих проектов из windowsforms в WPF. До сих пор я использовал этот кусок кода, чтобы вызвать мои объекты GUI с данными из другого потока:Вызов элемента управления в WPF, C#

this.Invoke(new Action<NewDiagPacketArrivedEventArgs>(DoSomething), e); 

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

Благодаря

+0

Вот простой пример использования 'Dispatcher.BeginInvoke' в WPF. Посмотрите на это: http://stackoverflow.com/questions/33316791/issue-with-updating-my-ui –

ответ

4

Попробуйте

this.Dispatcher.Invoke(()=>DoStuffOnGUIThread()); 

DoStuffInGUIThread() является метод, который содержит код, который вы хотите выполнить в потоке пользовательского интерфейса.

+0

Является коротким вариантом 'this.Dispatcher.Invoke (DoStuffOnGUIThread);' также возможно? – IllidanS4

+0

В этом случае да. Но вы не можете добавлять параметры и терять преимущество закрытия. –

+0

Если вызывается много диспетчеров, они могут работать с пользовательским интерфейсом, а основной поток активен, поэтому вам следует добавить «DispatcherPriority.ContextIdle». Он мгновенно обновляет пользовательский интерфейс. –

2

В Winforms мы используем Control.Invoke для маршалирования кода из другого потока в поток графического интерфейса. В WPF его Dispatcher.Invoke, каждый объект Dispatcher имеет свой собственный диспетчер, в очереди которого он будет маршалирован.

Dispatcher.BeginInvoke(new Action(() => 
{ 
    //Your code 
}));