2

如果我只是打电话

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

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

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

4

3 回答 3

3

在启动线程之前,您必须在线程上调用 SetApartmentState 以将其切换到 STA 。如果线程是线程池线程或者您使用的是 BackgroundWorker,则这是不可能的。

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

于 2011-08-17T14:46:53.250 回答
1

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

于 2011-08-17T12:57:45.917 回答
0

在新线程中创建 PrintDialog 对象然后调用

Dim myPDia As New PrintDialog
 If myPDia.ShowDialog() = Windows.Forms.DialogResult.OK Then
    PrintDocument1.Print()
 End If
于 2011-08-19T07:28:53.193 回答