Это небольшая ошибка в Winforms. Он содержит диагностический код в получателе свойства Handle, который проверяет, используется ли свойство в том же потоке, что и тот, который создал дескриптор. Хотя это чрезвычайно полезно для диагностики ошибок в потоках, это не всегда уместно. Один из таких случаев здесь, Windows фактически не требует, чтобы родительский элемент окна принадлежал тому же потоку.
Вы можете обойти эту проблему, вызвав функцию SetParent () или временно отключив проверку с помощью Control.CheckForIllegalCrossThreadCalls. Или с помощью Control.Invoke (), лучший способ. не обходите его, не указывая владельца. В отсутствие другого окна владельцем диалога является окно рабочего стола. Он не будет иметь отношения Z-порядка с другими окнами, у которых рабочий стол является их владельцем. И это заставит диалоговое окно иногда исчезать за другим окном, совершенно недоступным для пользователя.
Хотя есть большая проблема, отображение диалогов в потоках - неприятная проблема с юзабилити. Засунуть окно в лицо пользователя, пока он работает с вашей программой, - плохая идея. Невозможно сказать, что произойдет, когда она будет занята, нажимая и печатая. Ее случайное закрытие диалога даже без видения - это реальная опасность. Не делай этого.