Member 14068594 Ответов: 2

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);

2 Ответов

Рейтинг:
2

RickZeeland

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

Если вы ничего не используете с графическим интерфейсом, то это может помочь: Служба Windows Eception при использовании XpsDocument.Метод GetFixedDocumentSequence[^]

Цитата:
Большинство проектов, созданных Visual Studio, по умолчанию имеют значение MTA. Я должен запустить код внутри потока STA.

Еще одна вещь, которую вы можете попробовать, - это добавить манифест в свой проект для запуска от имени администратора:
в C# - как я могу заставить мой .Net-приложения для запуска в качестве администратора? - переполнение стека[^]


Рейтинг:
1

Dave Kreskowiak

Код печати, по - видимому, зависает, потому что он работает под рабочим столом служб, а не на рабочем столе пользователя. Диалоговое окно для печати появляется, но отображается на рабочем столе служб, который пользователь никогда не сможет увидеть. Диалог сидит там, ожидая ввода, который никогда не придет.