【问题标题】:Silverlight 5: print outside the UI thread?Silverlight 5:在 UI 线程外打印?
【发布时间】:2012-05-01 10:06:00
【问题描述】:

是否可以在 Silverlight 中打印而不阻塞 UI 线程?

我必须打印很多页面,因此我的 UI 会冻结一段时间。我想在后台线程上打印(并尽可能更新进度条),但不知道如何。

我尝试在BackgroundWorker 的DoWork() 方法中调用我的PrintDocument 的Print() 方法,但这给了我一个UnauthorizedAccessException "Invalid cross-thread access"。

似乎即使在 UI 线程之外启动 PrintDocument 也是不可能的: BackgroundWorker.DoWork() 中的 PrintDocument pd = new PrintDocument(); 抛出相同的异常。

我发现很多帖子都说打印必须在 UI 线程上进行,但没有相关文档。我是多线程的新手,所以任何正确方向的指针都将不胜感激。

【问题讨论】:

    标签: multithreading silverlight printing backgroundworker ui-thread


    【解决方案1】:

    我遇到了这个问题并遇到了这个问题,不幸的是没有我希望的答案。但我认为对于遇到这个问题的其他人来说,这至少可以说明一些问题。

    我关注this article 在 Silverlight 中打印,它就像在 UI 线程上进行常规打印的魅力一样,但实际上尝试在单独的线程上打印我认为这是不可能的。我把例子中的最后一行代码换掉了

    printDocument.Print("SLPrintDemo document");
    

    换一个看看能不能用

    new Thread(() => printDocument.Print("SLPrintDemo document")).Start();
    

    查看打印作业本身是否会在单独的线程中生成。然而,尽管代码编译并运行良好,但文档并没有打印出来。原因似乎是一旦打印命令被触发,它就会启动打印选项对话框以选择打印机和其他选项等。此时它不再在 UI 线程上,所以什么都没有发生(没有例外,所以我我假设他们被吞没在某个地方)

    据我所知,目前无法在 UI 线程中的 Silverlight 中进行打印。

    【讨论】:

      【解决方案2】:

      使用Dispatcher 更新您的用户界面。例如:

      Dispatcher.BeginInvoke(() =>
          {
              ProgressBar.Value = 100;
          });
      

      【讨论】:

      • 好的,我将使用它从 UI 线程外部更新 UI。但是我如何让打印首先在另一个线程中运行?打印可以在 UI 线程之外运行吗?
      • 对不起,我猜你不能。 Dispatcher 在这里也无济于事。有类似的问题stackoverflow.com/questions/4563831/…。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多