Утечка памяти DllHost.exe при получении PrintTicket
У меня есть приложение x86, работающее в Windows10 (64-битная среда). Одной из функций приложения является создание большого количества отчетов, поэтому требуется много печатать. Однако я заметил, что каждый раз, когда я пытаюсь использовать вызов DefaultPrintTicket в очереди печати, процесс dllhost (COM Surrogate) увеличивается в памяти.
Мне удалось изолировать ответственный код и переместить его в тестовое приложение WPF. При нажатии кнопки срабатывает этот код:
var localPrintServer = new LocalPrintServer();
var oneNotePrintQueue = localPrintServer.GetPrintQueues().FirstOrDefault(p => p.Description.Contains(OneNote));
var printTicket = oneNotePrintQueue?.DefaultPrintTicket;
Очередь печати не имеет значения, так как я пробовал их все, и проблема остается. Я знаю, что это может быть дубликатом: PrintTicket DllHost.exe Memory Climbs
Однако представленное там решение не работает, поскольку PrintTicked не является объектом IDisposable. Я также пробовал некоторые настройки в реестре (например, нахождение AppId AA0B85DA-FDDF-4272-8D1D-FF9B966D75B0 и удаление «AccessPermission», «LaunchPermission» и «RunAs») безрезультатно.
Я не могу перестроить приложение как AnyCpu, и я хотел бы избежать создания отдельного 64-битного процесса только для печати, поскольку было бы сложно отправить отчет, созданный в одном приложении, в другое.
Любые предложения приветствуются.
1 ответ
Кажется, тема сложная. Просто хочу поделиться решением, которое я использовал, на случай, если у кого-то еще возникнет такая же проблема.
В конце концов я создал отдельное приложение x64, которое занимается печатью. Изначально я хотел использовать службу WCF. Однако у меня возникли проблемы с сериализацией FixedDocuments и PrintQueue. Отсюда и отдельное приложение.
Решение далеко не идеальное и, на мой взгляд, совсем не красивое. Тем не менее, это решило проблему с утечкой памяти.