2

私が単に電話すると

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

正常に動作しますが、この関数を別のスレッドで使用するとエラーが表示されます

{"外部コンポーネントが例外をスローしました。"}

4

3 に答える 3

3

スレッドを開始する前に、スレッドで SetApartmentState を呼び出して STA に切り替える必要があります。スレッドがスレッドプール スレッドである場合、または BackgroundWorker を使用している場合、これは不可能です。

ダイアログには親がなく、別のウィンドウの後ろに隠れてしまう可能性があります。また、モーダルに動作しません。断然最良の解決策は、メイン スレッドで実行されるコードによってこのダイアログを表示することです。実際の印刷は、引き続きワーカー スレッドで行うことができます。必要に応じて Control.Invoke() を使用します。

于 2011-08-17T14:46:53.250 に答える
1

外部スレッドは、メイン UI でリクエストを呼び出す必要があります。スレッドから直接呼び出して UI を変更することはできません。

于 2011-08-17T12:57:45.917 に答える
0

新しいスレッドで PrintDialog のオブジェクトを作成して呼び出します

Dim myPDia As New PrintDialog
 If myPDia.ShowDialog() = Windows.Forms.DialogResult.OK Then
    PrintDocument1.Print()
 End If
于 2011-08-19T07:28:53.193 に答える