1

是否可以在不阻塞 UI 线程的情况下在 Silverlight 中打印?

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

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

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

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

4

2 回答 2

1

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

我正在关注这篇关于在 Silverlight 中打印的文章,它就像在 UI 线程上进行常规打印的魅力一样,但对于实际尝试在单独的线程上打印,我认为这是不可能的。我在示例中切换了最后一行代码

printDocument.Print("SLPrintDemo document");

和一个备用的,看看它是否可以工作

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

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

所以据我目前所知,没有办法在不在 UI 线程中的 Silverlight 中进行打印。

于 2012-07-26T16:25:24.253 回答
0

使用Dispatcher更新您的 UI。例如:

Dispatcher.BeginInvoke(() =>
    {
        ProgressBar.Value = 100;
    });
于 2012-05-01T10:47:21.117 回答