2014-11-24 5 views
0

인쇄 스풀러 역할을하는 서비스를 작성하려고합니다. 문서를 인쇄 할 때까지 기다렸다가 올바른 프린터로 올바른 설정으로 인쇄합니다. (PrintTicket에 저장 됨).PrintDialog : 호출 스레드가 다른 스레드가이 개체를 소유하고 있기 때문에이 개체에 액세스 할 수 없습니다.

한 묶음의 문서가 올 때마다 각 설정에 대해 스레드가 만들어지고 문서가 스레드에 병렬로 인쇄됩니다.

내가 WPF 응용 프로그램을 사용할 때 그것은 작동하지만 Windows 서비스에서 동일한 코드를 사용할 때 나는 PrintDialog.PrintVisual 함수 호출에이 오류를 얻을 : 호출 스레드가이 개체로 인해 액세스 할 수 없습니다

을 다른 스레드가 소유하고 있습니다

이 오류로 인해 검색 할 때 종종이 thread safe print dialog으로 끝나지 만 PrintVisual 기능을 제공하지 않습니다.

이 오류를 제거하는 방법에 대한 다른 아이디어가 있습니까? 당신의 도움이

답변

0

문제에 대한

덕분에 현재 UI 스레드에 표시되는 인쇄하려는 것으로, 그 문서 또는 시각이다. 이 문제를 해결하려면 시각 자료를 다시 만들어야합니다. 즉, 복사 생성자와 같은 것을 필요로합니다. 이것이 의미하는 바는 ControlX doc = new ControlX(visualToPrint)을 수행해야 비 UI 스레드의 컨트롤에 대한 새로운 참조를 생성한다는 것입니다. 이 시점부터 스레드가 컨트롤의 자체 복사본을 만들었으므로 이제 스레드가 컨트롤을 변경하고 원하는대로 인쇄 할 수 있습니다.

컨트롤을 성공적으로 다시 만든 후에는 .Show()을 호출하지 않으므로 강제로 새 레이아웃을 전달해야합니다. 에 의해 호출 것을 수행

.Measure(Rect); .Arrange(Point, Rect); .UpdateLayout();