.net - 哪些编程实践会影响窗口句柄的数量?

标签 .net windows winforms window-handles

我收到运行时错误“创建窗口句柄时出错”。根据我的研究,我知道这个错误通常表示应用程序已经超过了 Windows 的 10,000 个句柄限制,我应该通过确保句柄不是不必要地创建并被正确处理来解决这个错误。

但是,我找不到任何关于导致创建窗口句柄的原因的文档。每次实例化窗体时是否创建窗口句柄?每次我实例化一个控件?每次我实例化一个类?或者什么?

对于light-UI应用来说,是不是不需要特别关注使用的句柄数量,但是对于图形元素较多的应用,程序员必须采取措施限制窗口句柄的数量?这就是“无窗口控件”和“轻量级控件”的意义所在吗?还有其他我应该了解的相关概念吗?

到目前为止,我还没有认为我的应用程序特别需要 UI 密集型。但是,它确实显示图表网格,其中每个图表都是由多个组件控件组成的用户控件。对于大型分析,控件的总数可能达到数千个。假设我想保留此网格,是否可以应用特定技术来减少句柄计数?例如,有没有一种方法可以“呈现”控件,使其仍然可见,但不再需要窗口句柄?

-TC

最佳答案

However, I can't find any documentation on what causes a window handle to be created.

这可能是因为 .net 是一种抽象。

在 Win32 的“真实”世界中,窗口句柄由类型 HWND 表示,几乎所有东西都被赋予。每个按钮、菜单等都可以有一个 HWND

事实上,这并不完全正确。您可以创建的对象的每个 (在 C Windows API 中)都有一个句柄。每个类通常只绘制整个控件——但是,某些控件可能会绘制更复杂的控件,例如额外的按钮。他们可以创建另一个窗口(控件),也可以只使用 GDI 来绘制它。

因此,并非您看到的所有内容都会生成 HWND - 但大多数情况都会生成。

有趣的是,您可能想知道要在 C/Win32 中创建一个控件,您可以使用 CreateWindow()一切皆窗

现在回到您的 .net APP。如果您所依赖的控件通过其底层 CreateWindow 调用创建了大量对象,您将发出大量 HWND 变量并最终耗尽唯一标识符.

Mark Russinovich 在他的 pushing the limits of Windows 中涵盖了实际限制,他故意试图用尽他的应用程序的分配。

那么是什么编程实践导致了这种情况?创建过多的 Window 对象。这可能不对应于应用程序窗口意义上的实际 Windows,而是对应于控件的数量。避免这种情况的唯一方法是减少使用,或者如果第三方导致问题,请根据一次可以显示的实际限制设计您的应用程序。

另一种方法是生成您自己的控件,而不是使用子控件,而是绘制它们。然而,这可能需要大量工作。

关于.net - 哪些编程实践会影响窗口句柄的数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10323197/

相关文章:

windows - 如何查看当前操作系统是Windows、Linux还是OSX?

c# - 平面文件目标 预执行阶段失败。无法打开数据文件

.net - .NET下的原子文件复制

javascript - 使用 Kendo Grid 读取操作发布模型

c# - 查找哪个 .NET 程序集定义了类型

c# - 集成到 Windows 资源管理器上下文菜单

php - Docker 容器与网关的连接被拒绝

windows - Windows 上的 Node.js 串行端口访问被拒绝

当 Teamviewer 登录时,c# set focus on running application 失败

c# - 错误地绘制了应用了 DashStyle 的线条