Как получить текущее количество дескрипторов окна и предел дескрипторов окна в .NET?

Я хочу получить текущее количество оконных дескрипторов и общесистемный предел оконных дескрипторов в C#. Как мне это сделать?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
10
0
13 164
3

Ответы 3

Как однажды сказал Раймонд Чен, если вы думаете об ограничениях оконных дескрипторов, вы, вероятно, делаете что-то не так :)

В любом случае, я уверен, что нет специального способа C# сделать это, потому что он очень специфичен для системы. Вы можете использовать те же функции, что и в приложении C++. Вызов функций с помощью P / Invoke. Чтобы узнать, как писать импорт, перейдите к pinvoke.net.

Обновлено: насколько я понимаю ваш вопрос, я предполагаю, что вы уже знаете, как это сделать в приложении Win32.

Полная цитата, на которую ссылается OregonGhost:

If you have to ask, you're probably doing something wrong.

Это от Почему ограничение на количество дескрипторов окна на процесс составляет 10 000? Вы должны это прочитать.

Если вы прочитаете пост Раймонда Чена, он, вероятно, сочтет его так же раздражающим, как и я. Вы «вероятно делаете что-то не так» только потому, что делаете то, на что Windows не способна.

В моем приложении, когда пользователь впервые посещает страницу вкладки, я создаю и размещаю все элементы управления на этой странице. Это занимает заметное количество времени - на странице легко может быть 50 элементов управления. Поэтому я не отбрасываю элементы управления на странице вкладки после ее заполнения, если это вообще возможно, и оставляю закрывающие наборы страниц вкладок на усмотрение пользователя.

Как оказалось, некоторые пользователи никогда не хотят закрывать наборы вкладок Любые. Почему я должен их заставлять? С моим пользовательским интерфейсом они могут очень быстро переходить к любому из более чем 300 наборов транзакций, за управление которыми они несут ответственность. Их машины достаточно быстры и имеют достаточно памяти, чтобы все это было очень отзывчивым. Единственная проблема в том, что Windows его не поддерживает.

Почему я использую элементы управления, а не какую-то другую технологию пользовательского интерфейса? Потому что они Работа. Мне нужно поддерживать события фокуса, порядок табуляции, события проверки, динамический макет и привязку данных - пользователи фактически управляют тысячами записей в десятках таблиц в DataSet в памяти. Объем разработки, который мне пришлось бы сделать, чтобы, скажем, реализовать что-то с использованием элементов управления без окон, просто астрономический.

Я только «делаю это неправильно», потому что Windows жестко ограничивает количество поддерживаемых оконных дескрипторов. Этот жесткий предел основан на нескольких предположениях десятилетней давности о том, как может быть построен пользовательский интерфейс компьютера. Это не я «делаю что-то не так».

Во всяком случае, мое решение состоит из двух частей.

Во-первых, класс, который может сказать вам, сколько оконных обработчиков использует ваш процесс:

using System;
using System.Runtime.InteropServices;

namespace StreamWrite.Proceedings.Client
{
    public class HWndCounter
    {
        [DllImport("kernel32.dll")]
        private static extern IntPtr GetCurrentProcess();

        [DllImport("user32.dll")]
        private static extern uint GetGuiResources(IntPtr hProcess, uint uiFlags);

        private enum ResourceType
        {
            Gdi = 0,
            User = 1
        }

        public static int GetWindowHandlesForCurrentProcess(IntPtr hWnd)
        {
            IntPtr processHandle = GetCurrentProcess();
            uint gdiObjects = GetGuiResources(processHandle, (uint)ResourceType.Gdi);
            uint userObjects = GetGuiResources(processHandle, (uint)ResourceType.User);

            return Convert.ToInt32(gdiObjects + userObjects);
        }
    }
}

Во-вторых, я поддерживаю кэш объектов моей вкладки, который использовался не так давно. Платформа .NET не предоставляет общий класс кэша LRU, поэтому я создал его, и вы можете получить здесь, если он вам нужен. Каждый раз, когда пользователь посещает страницу вкладки, я добавляю ее в LRU Cache. Затем я проверяю, не заканчиваются ли оконные ручки. Если да, я выбрасываю элементы управления на странице вкладок, которые не использовались недавно, и продолжаю делать это до тех пор, пока у меня снова не будет достаточно оконных дескрипторов.

спасибо за код. Мое приложение не вылетает, когда я дохожу до 10000 дескрипторов, так как мне узнать, насколько я близок к пределу? С другой стороны, я получал сбои «Ошибка при создании дескриптора окна» с количеством дескрипторов всего несколько сотен в диспетчере задач, так что, возможно, эти сбои не имели ничего общего с лимитом. Я согласен с тем, что комментарии г-на Чена раздражают, особенно когда я смотрю на количество дескрипторов в диспетчере задач и вижу, что два приложения, которые находятся в диапазоне дескрипторов 4000-6000, - это devenv.exe и outlook.exe! Так что не говорите мне, что я делаю что-то не так, мистер "MSFT"!

uglycoyote 09.06.2018 01:44

Другие вопросы по теме