2011-08-17 37 views
2

打开打印对话框,如果我只需拨打如何能在另一个线程

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

其工作正常,但如果我在另一个线程中使用该功能,然后它会显示错误

{“外部组件引发例外。“}

+0

你究竟为什么要这么做呢?您应始终将所有UI事件保留在主(UI)线程上。 – 2011-08-17 14:51:34

回答

0

在新线程&创建PrintDialog类的对象,然后调用

Dim myPDia As New PrintDialog 
If myPDia.ShowDialog() = Windows.Forms.DialogResult.OK Then 
    PrintDocument1.Print() 
End If 
+0

但任何人都可以告诉我为什么发生这种情况,为什么我们不能从一个线程访问printdialog对象 – 2011-08-19 07:30:32

1

外部线程需要在主UI上调用请求。您无法直接通过线索拨打电话来更改用户界面。

3

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

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