如果我只是打电话
If PrintDialog1.ShowDialog = DialogResult.OK Then
PrintDocument1.Print()
End If
它工作正常,但如果我在另一个线程中使用这个函数,那么它会显示错误
{“外部组件引发的异常。”}
如果我只是打电话
If PrintDialog1.ShowDialog = DialogResult.OK Then
PrintDocument1.Print()
End If
它工作正常,但如果我在另一个线程中使用这个函数,那么它会显示错误
{“外部组件引发的异常。”}
在启动线程之前,您必须在线程上调用 SetApartmentState 以将其切换到 STA 。如果线程是线程池线程或者您使用的是 BackgroundWorker,则这是不可能的。
否则这是一个坏主意,对话框将没有父级,并且可能会消失在另一个窗口后面。它也不会是模态的。到目前为止,最好的解决方案是通过在主线程上运行的代码来显示此对话框。实际的打印仍然可以在工作线程上进行。根据需要使用 Control.Invoke()。
外部线程需要在主 UI 上调用请求。您不能直接从 Thread 调用来进行 UI 更改。
在新线程中创建 PrintDialog 对象然后调用
Dim myPDia As New PrintDialog
If myPDia.ShowDialog() = Windows.Forms.DialogResult.OK Then
PrintDocument1.Print()
End If