Сбой создания диспетчера текущего потока в новом потоке STA - PullRequest
0 голосов
/ 27 июня 2019

У меня есть служба Windows, работающая под учетной записью локальной системы, которая анализирует документы 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 до запуска кода изатем он сразу же рухнул (поэтому, если какое-либо из этих значений изменилось, его было слишком быстро увидеть до сбоя).

Есть идеи?

...