如何在另一个线程中打开打印对话框

时间:2011-08-17 12:55:10

标签: .net multithreading printdialog

如果我只是致电

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

它工作正常,但如果我在另一个线程中使用此函数,那么它将显示错误

{“外部组件引发了异常。”}

3 个答案:

答案 0 :(得分:3)

您必须在线程上调用SetApartmentState,才能在启动线程之前将其切换到STA 。如果线程是线程池线程或者您正在使用BackgroundWorker,则无法执行此操作。

这是一个坏主意,对话框没有父对象,可能会在另一个窗口后消失。它也不会采取模态行动。到目前为止,最好的解决方案是通过在主线程上运行的代码显示此对话框。实际打印仍然可以在工作线程上进行。根据需要使用Control.Invoke()。

答案 1 :(得分:1)

外部线程需要在主UI上调用请求。您不能直接从Thread调用来进行UI更改。

答案 2 :(得分:0)

在新线程&中创建PrintDialog的对象然后打电话

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