1

Можно ли печатать в Silverlight без блокировки нити пользовательского интерфейса?Silverlight 5: печать за пределами пользовательского интерфейса?

Мне нужно распечатать много страниц, и, следовательно, мой пользовательский интерфейс замерзает какое-то время. Я хотел бы напечатать на фоновом потоке вместо этого (и, если возможно, обновить индикатор выполнения), но не могу понять, как это сделать.

Я пытался называть Print() метод моей PrintDocument внутри DoWork() метода BackgroundWorker, но это дает мне UnauthorizedAccessException "Invalid cross-thread access".

Похоже, что даже инициирование PrintDocument невозможно за пределами потока пользовательского интерфейса: PrintDocument pd = new PrintDocument(); в BackgroundWorker.DoWork() вызывает то же исключение.

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

ответ

1

У меня была эта проблема и наткнулся на этот вопрос, к сожалению, у меня не было ответа, на который я надеялся. Но я думал, что для всех, кто сталкивается с этой проблемой, это может, по крайней мере, пролить свет.

Я слежу за this article при печати в Silverlight, он работает как прелесть для регулярной печати в потоке пользовательского интерфейса, но на самом деле пытается напечатать на отдельной теме, я не думаю, что это возможно. Я выключил последнюю строку кода в примере

printDocument.Print("SLPrintDemo document"); 

с альтернативным один, чтобы увидеть, если он будет работать

new Thread(() => printDocument.Print("SLPrintDemo document")).Start(); 

Чтобы увидеть, если задание на печать сама будет появляться в отдельном потоке. Однако, хотя код компилируется и работает нормально, документ не печатает. Причина заключается в том, что после запуска команды «Печать» она запускает диалог параметров печати для выбора принтера и других параметров и т. Д. В этот момент он больше не работает в потоке пользовательского интерфейса, поэтому ничего не происходит (никаких исключений, поэтому я ' m, предполагая, что они где-то проглатываются)

Насколько я могу судить в данный момент, в Silverlight нет возможности печатать, что нет в потоке пользовательского интерфейса.

0

Используйте Dispatcher для обновления вашего интерфейса. Например:

Dispatcher.BeginInvoke(() => 
    { 
     ProgressBar.Value = 100; 
    }); 
+0

Хорошо, я использовал бы это, чтобы обновить интерфейс из-за пределов пользовательского интерфейса. Но как мне заставить печать работать в другом потоке в первую очередь? Может ли печать работать за пределами пользовательского интерфейса? – Phasma

+0

Извините, я думаю, вы не можете. Диспетчер тоже не поможет. Существует аналогичная проблема http://stackoverflow.com/questions/4563831/how-can-i-display-a-busyindicator-during-printing-in-silverlight-4. – Zabavsky