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