Как создать документ в фоновом режиме, распечатать его в программе просмотра? - PullRequest
0 голосов
/ 19 мая 2011

У меня есть функция, которая печатает буквы.Они создаются в PDF, затем перетаскиваются в PDFViewer и печатаются.

Существует потребность в некоторых функциях, обеспечивающих больший контроль над печатью, поэтому было бы хорошо сделать буквы в фоновом потоке, чтобы пользовательский интерфейс оставался активным.Однако, когда я пытаюсь отправить документ в PDFViewer, я получаю ошибку «операция с несколькими потоками».

Я не хочу создавать новый PDFViewer для каждого 1-страничного документа.Какой лучший способ создать буквы в фоновом режиме, а затем распечатать их?

Ответы [ 2 ]

0 голосов
/ 19 мая 2011

Обычно я решаю эту проблему - написать метод, который портит проблему с многопоточностью.Я склонен писать метод расширения:

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 имеют понятие «поток пользовательского интерфейса», но нетлюбой отдельный поток, на котором больше всего будет работать весь пользовательский интерфейс.Важно то, что некоторые операции над элементами управления могут выполняться только для потоков, которые были созданы в .Учитывая это, безопаснее всего попросить элемент управления вызвать ваше действие, чтобы гарантировать, что выполнение будет выполнено в потоке, в котором он был создан.

0 голосов
/ 19 мая 2011

Вам необходимо отправить печать в поток, создавший PDFViewer.Поэтому, если вы создали средство просмотра в потоке пользовательского интерфейса, вам необходимо выполнить печать в потоке пользовательского интерфейса после завершения создания документа:

Application.Current.Dispatcher.BeginInvoke(() => PrintStuff())
...