私が単に電話すると
If PrintDialog1.ShowDialog = DialogResult.OK Then
PrintDocument1.Print()
End If
正常に動作しますが、この関数を別のスレッドで使用するとエラーが表示されます
{"外部コンポーネントが例外をスローしました。"}
私が単に電話すると
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