如何在另一个线程中打开打印对话框
如果我只是简单地调用
If PrintDialog1.ShowDialog = DialogResult.OK Then
PrintDocument1.Print()
End If
它的工作正常,但如果我在另一个线程中使用此函数,那么它将显示错误
{“外部组件引发了异常。”}
If i simply call
If PrintDialog1.ShowDialog = DialogResult.OK Then
PrintDocument1.Print()
End If
its working fine but if i use this function in another thread then it will shows error
{"External component has thrown an exception."}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
在新线程中创建 PrintDialog 对象然后打电话
Create object of PrintDialog in new thread & then call
在启动线程之前,您必须在线程上调用 SetApartmentState 将其切换到 STA。如果线程是线程池线程或者您正在使用BackgroundWorker,则这是不可能的。
否则这是一个坏主意,对话框不会有父级,并且可能会消失在另一个窗口后面。它也不会表现出模态。到目前为止,最好的解决方案是通过在主线程上运行的代码来显示此对话框。实际的打印仍然可以在工作线程上进行。根据需要使用 Control.Invoke()。
You have to call SetApartmentState on the thread to switch it to STA before you start the thread. This is not possible if the thread is a threadpool thread or if you are using BackgroundWorker.
This is otherwise a bad idea, the dialog won't have a parent and is likely to disappear behind another window. Nor will it act modal. By far the best solution is to display this dialog by code that runs on the main thread. The actual printing can still take place on the worker thread. Use Control.Invoke() as required.
外部线程需要在主 UI 上调用请求。您无法直接从线程进行调用来更改 UI。
External threads need to Invoke requests on main UI. You can't directly make a call from a Thread to make UI changes.