Почему мой RunWorkerCompletedEventHandler может вызывать основной поток несколько раз параллельно? - PullRequest
0 голосов
/ 24 февраля 2020

My BackgroundWorker s RunWorkerCompletedEventHandler вызывает функцию в моем основном потоке, которая показывает диалог MessageBox. Я проверил, что происходит, если я периодически вызываю BW (с Timer), и я не понимаю, почему это заставляет меня получать несколько окон сообщений с течением времени. Я имею в виду, не должен ли поток GUI быть заблокирован во время вызова моей функции RunWorkerCompletedEventHandler? Всякий раз, когда я закрываю диалоговое окно, остальная часть функции выполняется как обычно для каждого диалогового окна.

Если я заменю MessageBox.Show на Thread.Sleep, то у меня нет этой проблемы. Все вызовы функции выполняются один за другим. Во время сна второго вызова не происходит, как это происходит с MessageBox -es.

Почему это неожиданное поведение происходит для MessageBox, и я могу изменить его, чтобы правильно заблокировать поток?

1 Ответ

2 голосов
/ 24 февраля 2020

Отображение окна сообщения (или его закрытия) не является действием, требующим непрерывного использования потока пользовательского интерфейса. Поток пользовательского интерфейса используется для создания нового пользовательского интерфейса, который представляет окно сообщения, но затем возвращается (версия) к сообщению l oop, в котором он ожидает новой работы.

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

...