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

时间:2011-05-18 20:15:15

标签: c# backgroundworker

我有一个打印字母的功能。它们以PDF格式创建,然后被拉入PDFViewer并打印出来。

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

我不想为每个1页文档创建新的PDFViewer。在背景中创建字母然后打印出来的最佳方法是什么?

2 个答案:

答案 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。重要的是控件上的某些操作只能在创建的线程上完成。鉴于此,最安全的做法是让控件调用您的操作,以确保执行在其创建的线程上完成。