C# 如何在后台创建文档,在查看器中打印文档?
我有一个打印字母的函数。它们以PDF格式创建,然后拉入PDFViewer并打印 有些功能需要对打印进行更大的控制,因此最好在后台线程中打印字母,以便UI保持活动状态。但是,当我尝试将文档发送到PDFViewer时,我得到一个“跨线程操作”错误C# 如何在后台创建文档,在查看器中打印文档?,c#,backgroundworker,C#,Backgroundworker,我有一个打印字母的函数。它们以PDF格式创建,然后拉入PDFViewer并打印 有些功能需要对打印进行更大的控制,因此最好在后台线程中打印字母,以便UI保持活动状态。但是,当我尝试将文档发送到PDFViewer时,我得到一个“跨线程操作”错误 我不想为每个1页文档创建新的PDFViewer。在后台创建字母,然后打印它们的最佳方法是什么?您需要将打印发送到创建PDFViewer的线程。因此,如果在UI线程上创建了查看器,则需要在完成文档创建后在UI线程中执行打印: Application.Curr
我不想为每个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是一个瓶颈。你为什么不直接打印呢?这是一个更简单的解决方案。谢谢你的评论。下次我会记住这一点。