0

印刷スプーラーとして機能するサービスを作成しようとしています。ドキュメントが印刷され、適切な設定で適切なプリンターに印刷されるのを待ちます (PrintTicket に保存されます)。

ドキュメントの束が来るたびに、設定ごとにスレッドが作成され、ドキュメントはそのスレッドで並行して印刷されます。

WPF アプリケーションを使用すると機能しますが、Windows サービスで同じコードを使用すると、PrintDialog.PrintVisual 関数呼び出しで次のエラーが発生します。

別のスレッドがこのオブジェクトを所有しているため、呼び出しスレッドはこのオブジェクトにアクセスできません

このエラーをグーグルで検索すると、このスレッドセーフな印刷ダイアログが表示されることがよくありますが、 PrintVisual 関数は提供されていません。

このエラーを取り除く方法に関する他のアイデアはありますか?

ご協力いただきありがとうございます

4

1 に答える 1

0

問題は、印刷しようとしているドキュメントまたはビジュアルが現在 UI スレッドに表示されていることです。これを回避するには、ビジュアルを再作成する必要があります。これは、コピー コンストラクターのようなものが必要であることを意味します。ControlX doc = new ControlX(visualToPrint)これが意味することは、非 UI スレッドでコントロールへの新しい参照を作成する必要があるということです。その時点から、スレッドはコントロールの独自のコピーを作成したため、必要に応じて変更して印刷できるようになりました。

コントロールを正常に再作成した後、 を呼び出していないため、新しいレイアウト パスを強制する必要があることに注意してください.Show()。それを行うには、次のように呼び出します。

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

于 2014-12-18T05:40:32.203 に答える