我有一个打印字母的功能。它们以PDF格式创建,然后被拉入PDFViewer并打印出来。
需要一些功能可以更好地控制打印,因此最好在后台线程中执行字母,以便UI保持活动状态。但是,当我尝试将文档发送到PDFViewer时,出现“跨线程操作”错误。
我不想为每个1页文档创建新的PDFViewer。在背景中创建字母然后打印出来的最佳方法是什么?
答案 0 :(得分:0)
您需要将打印发送到创建PDFViewer的线程。因此,如果您在UI线程上创建了查看器,则需要在创建文档后在UI线程中执行打印:
Application.Current.Dispatcher.BeginInvoke(() => PrintStuff())
答案 1 :(得分:0)
我通常解决这个问题的方法是编写一个与线程问题混淆的方法。我倾向于写一个扩展方法:
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。重要的是控件上的某些操作只能在创建的线程上完成。鉴于此,最安全的做法是让控件调用您的操作,以确保执行在其创建的线程上完成。