如果我只是致电
If PrintDialog1.ShowDialog = DialogResult.OK Then
PrintDocument1.Print()
End If
它工作正常,但如果我在另一个线程中使用此函数,那么它将显示错误
{“外部组件引发了异常。”}
答案 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