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

本文关键字:打印 文档 后台 创建 | 更新日期: 2023-09-27 17:56:45

我有一个打印字母的函数。它们以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 的处理。重要的是,对控件的某些操作只能在创建它们的线程上完成。鉴于此,最安全的方法是要求控件调用您的操作,以便确保在创建它的线程上完成执行。