Я новичок в C #. Есть проект, над которым я работаю, для использования двух потоков. Основной - для отображения обычных страниц Wpf. Еще один контролирует входы от оборудования. Если обнаружен желаемый входной сигнал, вся система должна остановиться и отобразить страницу предупреждения в окне, которое контролируется основным потоком.

Теперь я застрял в том, как вести себя с потоками при обнаружении входного сигнала. Должен ли я передать сигнал основному потоку и попросить основной поток отобразить страницу предупреждения и остановить вспомогательный поток. Или я должен позволить вторичному потоку отображать страницу предупреждения напрямую и взять на себя приоритет управления от основного потока?

-1
C.L 9 Окт 2020 в 21:22

2 ответа

Лучший ответ

WPF, как и большинство наборов инструментов GUI в Windows, по крайней мере, имеет липкие элементы управления, что по сути означает, что они имеют сходство с потоками и не могут быть доступны из другого потока, который их не создавал. [Вы можете проверить это из источника, звонки в VerifyAccess() разбросаны повсюду.]

Это конструктивное ограничение исключает возможность того, что другой поток когда-либо «перехватит» что-либо у другого потока.

Но мир на этом не заканчивается, и межпоточная коммуникация является достаточно распространенным требованием, поэтому дизайнеры предоставили вам средства для удовлетворения тех же требований к потокам, но при отправке сообщений между потоками.

Для этого нужно использовать два члена объекта Dispatcher в каждом окне WPF. Вы можете прочитать полную информацию здесь и на связанных страницах этого типа, но примерно так

 protected void Button_Clicked(object sender, EventArgs args) =>
     Dispatcher.Invoke(() => { /* Your method body which will be executed on the proper thread. */ });

Если вы предпочитаете асинхронную связь, вы можете использовать вместо этого BeginInvoke или InvokeAsync.

0
Tanveer Badar 9 Окт 2020 в 18:38

Или я должен позволить вторичному потоку отображать страницу предупреждения напрямую и взять на себя управление от основного потока?

В этом буквально нет никакого смысла.

Должен ли я остановить вторичный поток и передать сигнал основному потоку и попросить основной поток отобразить страницу предупреждения.

В этом тоже нет никакого смысла, но, по крайней мере, есть проблеск того, что вы здесь имеете в виду. Чтобы быть абсолютно ясным, не существует такой вещи, как «остановка потоков», как вы имеете в виду.

Но да, вы отправляете сообщение потоку графического интерфейса пользователя, чтобы обновить его состояние, в частности, используя Dispatcher.BeginInvoke в WPF.

1
Blindy 9 Окт 2020 в 18:27