Xpsdocumenwriter зависает от службы windows, но отлично работает при запуске из консоли
У меня есть служба окон, которая используется для выполнения различных заданий, в том числе для печати документа, сгенерированного с помощью WPF. При запуске консольного приложения оно работает нормально, но при запуске из службы windows оно просто зависает.
Позвольте мне немного объяснить оконную службу. Чтобы свести к минимуму любой возможный побочный эффект, служба Windows - это просто оболочка для реальной консоли. Таким образом, при запуске службы окон (в ее методе запуска) происходит простой процесс.Запустите вызов, который вызывает консоль, вот так:
Process.Start("[path_to_my_console_exe]");
Теперь, когда вызывается код для печати, он просто зависает. Я использую PrintDialog API для печати документа. Вызов для печати документа очень прост:
var printDialog = new PrintDialog(); printDialog.PrintDocument(doc.DocumentPaginator);Когда PrintDocument будет поражен, он заблокирует выполнение (метод никогда не закончится).
Поэтому я провел небольшое расследование. Поиск в Google дал мне несколько подсказок, поэтому я убедился, что служба Windows работает с теми же разрешениями, что и автономная консоль.
Я убедился, что служба Windows работает как процесс x64, так же как и автономная консоль
Я попытался отладить
PrintDialog.PrintDocument
метод. Я грамотно скачал код из referencesource, и это дало мне новое понимание, но, к сожалению, это тоже не решило проблему, а просто указало дальше, какой метод блокирует выполнение (это так
XpsDocumentWriter.Writer
метод, строка 460).Теперь, после всего этого, я уверен, что это должно быть что-то, касающееся разрешений. Хотя служба Windows использует одного и того же пользователя для запуска в качестве автономного консольного приложения (admin user), мне кажется, что она все еще не имеет всех необходимых разрешений.
Есть ли здесь что-то особенное с сервисом Windows? Может быть, я что-то упустил, есть ли что-то еще, что должно быть установлено для службы Windows перед запуском консоли?
Что я уже пробовал:
Process.Start("[path_to_my_console_exe]");
.
.
.
var printDialog = new PrintDialog(); printDialog.PrintDocument(doc.DocumentPaginator);