C# 如何在后台创建文档,在查看器中打印文档?

C# 如何在后台创建文档,在查看器中打印文档?,c#,backgroundworker,C#,Backgroundworker,我有一个打印字母的函数。它们以PDF格式创建,然后拉入PDFViewer并打印 有些功能需要对打印进行更大的控制,因此最好在后台线程中打印字母,以便UI保持活动状态。但是,当我尝试将文档发送到PDFViewer时,我得到一个“跨线程操作”错误 我不想为每个1页文档创建新的PDFViewer。在后台创建字母,然后打印它们的最佳方法是什么?您需要将打印发送到创建PDFViewer的线程。因此,如果在UI线程上创建了查看器,则需要在完成文档创建后在UI线程中执行打印: Application.Curr

我有一个打印字母的函数。它们以PDF格式创建,然后拉入PDFViewer并打印

有些功能需要对打印进行更大的控制,因此最好在后台线程中打印字母,以便UI保持活动状态。但是,当我尝试将文档发送到PDFViewer时,我得到一个“跨线程操作”错误


我不想为每个1页文档创建新的PDFViewer。在后台创建字母,然后打印它们的最佳方法是什么?

您需要将打印发送到创建PDFViewer的线程。因此,如果在UI线程上创建了查看器,则需要在完成文档创建后在UI线程中执行打印:

Application.Current.Dispatcher.BeginInvoke(() => PrintStuff())

我通常解决这个问题的方法是编写一个处理线程问题的方法。我倾向于编写一个扩展方法:

public static class ControlExtensions
{
    public static void Invoke(this Control control, Action action)            
    {            
        if (control.InvokeRequired)
            control.Invoke(action);
        else
            action();
    }
}
用法如下所示:

pdfViewer.Invoke(() => pdfViewer.Add(pdfDocument));

大多数WinForms应用程序都有一个“UI线程”的概念,但并没有一个线程可以完成所有UI任务。重要的是,控件上的某些操作只能在创建它们的线程上执行。有鉴于此,最安全的做法是要求控件调用您的操作,以便确保在创建它的线程上执行。

pdfviewer是一个瓶颈。你为什么不直接打印呢?这是一个更简单的解决方案。谢谢你的评论。下次我会记住这一点。