2011-08-17 125 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()。