【问题标题】:How can open print dialog box in another thread如何在另一个线程中打开打印对话框
【发布时间】:2011-08-17 12:55:10
【问题描述】:

如果我只是打电话

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

它工作正常,但如果我在另一个线程中使用这个函数,那么它会显示错误

{"外部组件抛出异常。"}

【问题讨论】:

  • 您为什么要这样做?您应该始终将所有 UI 事件保留在主 (UI) 线程上。

标签: .net multithreading printdialog


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    外部线程需要在主 UI 上调用请求。您不能直接从 Thread 调用来更改 UI。

    【讨论】:

      【解决方案3】:

      在新线程中创建 PrintDialog 对象然后调用

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

      【讨论】:

      • 但是谁能告诉我为什么会发生这种情况,为什么我们不能从一个线程访问 printdialog 的对象到另一个线程
      猜你喜欢
      • 1970-01-01
      • 2012-11-10
      • 1970-01-01
      • 2015-12-30
      • 2015-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多