Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net PrintDialog:调用线程无法访问此对象,因为其他线程拥有它_.net_Multithreading_Printdialog - Fatal编程技术网

.net PrintDialog:调用线程无法访问此对象,因为其他线程拥有它

.net PrintDialog:调用线程无法访问此对象,因为其他线程拥有它,.net,multithreading,printdialog,.net,Multithreading,Printdialog,我正在尝试编写一个充当后台打印程序的服务:它等待文档打印,并使用正确的设置(存储在打印票据中)在正确的打印机上打印 每次有一堆文档出现时,都会为每个设置创建一个线程,并在线程中并行打印文档 当我使用WPF应用程序时,它可以工作,但当我在windows服务中使用相同的代码时,我在PrintDialog.PrintVisual函数调用中遇到以下错误: 调用线程无法访问此对象,因为其他线程拥有它 在谷歌上搜索这个错误时,我经常会得到这样的结果,但它没有提供PrintVisual功能 关于如何消除这个错

我正在尝试编写一个充当后台打印程序的服务:它等待文档打印,并使用正确的设置(存储在打印票据中)在正确的打印机上打印

每次有一堆文档出现时,都会为每个设置创建一个线程,并在线程中并行打印文档

当我使用WPF应用程序时,它可以工作,但当我在windows服务中使用相同的代码时,我在PrintDialog.PrintVisual函数调用中遇到以下错误:

调用线程无法访问此对象,因为其他线程拥有它

在谷歌上搜索这个错误时,我经常会得到这样的结果,但它没有提供PrintVisual功能

关于如何消除这个错误还有其他想法吗


感谢您的帮助

问题在于您试图打印的文档或可视文档当前显示在UI线程上。为了避免这种情况,您需要重新创建视觉效果。这意味着您需要像复制构造函数这样的东西。这意味着您需要执行
ControlX doc=new ControlX(visualToPrint)
,这将在非UI线程上创建对控件的新引用。从那时起,由于线程创建了自己的控件副本,它现在可以更改它并按自己的意愿打印它

请记住,成功重新创建控件后,您需要强制执行新的布局过程,因为您没有调用
.Show()
。请致电:

.Measure(Rect)
.Arrange(点、直线)
.UpdateLayout()