Как открыть диалоговое окно печати в другой теме - PullRequest
2 голосов
/ 17 августа 2011

Если я просто позвоню

If PrintDialog1.ShowDialog = DialogResult.OK Then
                                        PrintDocument1.Print()
                                    End If

работает нормально, но если я использую эту функцию в другом потоке, то будет отображаться ошибка

{"Внешний компонент выдал исключение."}

Ответы [ 3 ]

3 голосов
/ 17 августа 2011

Вы должны вызвать SetApartmentState в потоке, чтобы переключить его на STA до того, как запустит поток.Это невозможно, если поток является потоком пула потоков или если вы используете BackgroundWorker.

В противном случае это плохая идея, диалоговое окно не будет иметь родителя и, вероятно, исчезнет за другим окном.И при этом это не будет модальным.Безусловно, лучшим решением является отображение этого диалога с помощью кода, который выполняется в главном потоке.Фактическая печать может все еще иметь место в рабочем потоке.При необходимости используйте Control.Invoke ().

1 голос
/ 17 августа 2011

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

0 голосов
/ 19 августа 2011

Создать объект PrintDialog в новом потоке и затем вызвать

Dim myPDia As New PrintDialog
 If myPDia.ShowDialog() = Windows.Forms.DialogResult.OK Then
    PrintDocument1.Print()
 End If
...