我有一个在本地系统帐户下运行的Windows服务,该服务可以分析XPS文档。
在一台机器上,在分析线程上创建调度程序总是会失败,但在我们尝试过的所有其他机器上,它都可以正常工作。
故障机器正在运行带有.NET 4.7.2的Server 2012 R2,我相信我们之前已经在该OS上测试了此代码,并且一切正常,但是我现在正在设置VM进行确认。
这是失败代码的最低版本:
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]
我已经看到this one之类的线程在谈论引起此问题的内存泄漏,但有趣的是,每次在此计算机上运行此代码时,都会发生此问题,而我们要做的就是尝试创建调度程序,因此如果这是问题,那不是长期的泄漏,而是一次又一次超出了所有限制。
按照该线程中的建议,我确实尝试在任务管理器运行时查看其句柄,用户对象和GDI对象,并且句柄大约为800,在代码运行之前用户对象和GDI对象都为0,然后崩溃了立即(因此,如果这些值中的任何一个发生更改,那么崩溃前就太快了)。
有什么想法吗?