如何在后台创建文档,在查看器中打印
本文关键字:打印 文档 后台 创建 | 更新日期: 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 的处理。重要的是,对控件的某些操作只能在创建它们的线程上完成。鉴于此,最安全的方法是要求控件调用您的操作,以便确保在创建它的线程上完成执行。