У меня есть служба Windows, работающая под учетной записью Local System, которая анализирует документы XPS.
На одной машине создание диспетчера в потоке анализа всегда терпит неудачу, но на всех других машинах, которые мы пробовали, это работало без каких-либо проблем.
На неисправной машине работает Server 2012 R2 с .NET 4.7.2, я полагаю, что мы ранее тестировали этот код на этой ОС, и все работало, но я настраиваю виртуальную машину, чтобы подтвердить это сейчас.
Вот минимальная версия кода, который дает сбой:
var staThread = new Thread(() => {
var _ = Dispatcher.CurrentDispatcher;
// Code that does the analysis would be here but is never reached
});
staThread.SetApartmentState(ApartmentState.STA);
staThread.Start();
staThread.Join();
И вот исключение:
System.ComponentModel.Win32Exception (0x80004005): Not enough storage is available to process this command
at MS.Win32.UnsafeNativeMethods.CreateWindowEx(Int32 dwExStyle, String lpszClassName, String lpszWindowName, Int32 style, Int32 x, Int32 y, Int32 width, Int32 height, HandleRef hWndParent, HandleRef hMenu, HandleRef hInst, Object pvParam)
at MS.Win32.HwndWrapper..ctor(Int32 classStyle, Int32 style, Int32 exStyle, Int32 x, Int32 y, Int32 width, Int32 height, String name, IntPtr parent, HwndWrapperHook[] hooks)
at System.Windows.Threading.Dispatcher..ctor()
at System.Windows.Threading.Dispatcher.get_CurrentDispatcher()
... [name of the class/method with the above code omitted]
Я видел такие темы, как этот говорить об утечках памяти, вызывающих эту проблему, но интересно, что эта проблема возникает каждый раз, когда этот код запускается на этой машине, и все, что мы делаем, это пытаемся создать диспетчер, так что если это проблема, это не долгосрочная утечка. поскольку пределы как-то превышаются сразу.
Как рекомендовано в этом потоке, я попытался посмотреть на дескрипторы, пользовательские объекты и объекты GDI в диспетчере задач, пока он работал, и дескрипторы были около 800, пользовательские объекты и объекты GDI были равны 0 до запуска кода, а затем он сразу же разбился (так что если какое-либо из этих значений изменилось, это было слишком быстро, чтобы увидеть до сбоя).
Любые идеи?
System.Diagnostics.Process
, предотвратит ли это проблему или она все равно будет работать в сеансе 0? (Я проведу небольшое исследование по этому поводу, но, может быть, вы знаете это навскидку.) - person Lawrence Johnston   schedule 27.06.2019