Вопрос по multithreading, c# – Создание формы и использование Form.ShowDialog в фоновом потоке

8

Используя Winforms, Если я нахожусь в потоке, который не является "основным" UI поток я могу безопасно

Create a Form, Call ShowDialog on that form

Кажется, я бы подчинялся правилу: Элементы управления Winforms должны быть изменены в потоке, в котором они были созданы.

Из некоторых прочитанных мною чтений кажется, что ShowDialog создаст свой собственный насос сообщений, так что мне не нужно беспокоиться о том, что Форма создается в потоке, в котором уже есть насос сообщений.

Подоплекой вопроса является то, что я получаю обратный вызов, когда я хотел бы отобразить некоторый пользовательский интерфейс Winforms, но у меня нет доступа к любому другому пользовательскому интерфейсу, который я мог бы использовать для вызова основного потока.

+1 это был отличный вопрос. Jeremy Thompson

Ваш Ответ

2   ответа
7

хотя очень важно, чтобы вы вызвали метод SetApartmentState () потока, чтобы переключить поток в STA. Это важно для многих операций пользовательского интерфейса, включая буфер обмена, перетаскивание и диалоги оболочки. И что у вас обычно возникает злобная проблема Z-порядка, когда форма, которую вы создаете в потоке, не находится на переднем плане и скрывается за другим окном. Или имеет неприятную привычку на самом делеdo перемещаться на передний план, когда пользователь не ожидает этого, и неожиданно нажимать кнопку мыши или нажатие клавиши.

Это трудные проблемы для решения, они делают ваше приложение нестабильным. Нет веской причины не иметь ссылку для вызова, вы также можете передать ее классу каким-то образом. Вы всегда можете использовать Application.OpenForms [0], если это действительно необходимо.

Это все еще существует, легко избежать однако.
Спасибо, Ганс. Есть ли недостатки использования Application.OpenForms [0]? Всегда ли гарантировано существование? Matt Smith
@MattSmith: да, но я нашелthis SO post подробно об ошибке, не уверен, что она все еще существует.
2

вы можете сделать это, но если вы хотите, чтобы диалог фактически действовал как модальный диалог (т.е. блокирует родительское окно, которое, как я полагаю, вы хотите, так как вы вызываетеShowDialog) тогда будьте готовы разочароваться.

Какую проблему вы на самом деле пытаетесь решить здесь. Похоже, вы хотите модальное диалоговое окно, которое не блокирует, что немного странно. Если вы объясните проблему, возможно, существует решение, которое вы еще не рассматривали.

Хорошая точка зрения. В моем случае я получаю обратный вызов, и в это время может отображаться или не показываться другой пользовательский интерфейс. У меня нет причин не участвовать в главном потоке пользовательского интерфейса, просто у меня не было элемента управления, с помощью которого я мог бы вызывать. Matt Smith

Похожие вопросы