2013-08-03 2 views
0

В моем приложении C#, когда он запускается, я могу ясно видеть в диспетчере задач Windows, что количество столбцов столбцов постоянно увеличивается. Память прекрасна и не увеличивается, только ручка достигает очень высокого уровня.Как обнаружить утечку дескриптора в приложении C#

Как я могу отладить эту утечку, обнаружить ее и решить проблему утечки рукоятки.

Спасибо!

+0

Какие-либо сторонние элементы пользовательского интерфейса? можете ли вы объяснить структуру приложения немного больше, здесь не хватает информации. – christiandev

+0

Нет элементов управления 3 стороннего интерфейса. Я думаю, что это не связано с пользовательским интерфейсом, и утечка исходит из логики. приложение очень большое и сложное, это немного сложно объяснить ее разлом. – maz

+0

Возможный дубликат [Как получить текущий счетчик ручек окна и лимит дескриптора окна в .NET?] (Http://stackoverflow.com/questions/143206/how-do-you-obtain-current-window-handle-count и-оконный ручка-предел-в-сети) – Wolf

ответ

0

Я сомневаюсь, что это то, что вы собираетесь отлаживать; это то, что вы найдете с проверкой кода. Возможные причины:

  1. Невозможно утилизировать объекты GDI. Вы используете WinForms? У вас есть using заявления на каждую кисть и ручку?

  2. Подходит ли ваш счетчик количества оборотов с количеством ручек? Вы начинаете темы, которые никогда не заканчиваются?

  3. Вы используете LogonUser? CloseHandle? Вы должны очень осторожно распоряжаться ручками пользователя. Если вы передадите дескриптор входа в WindowsIdentiy, вы должны удалить его сразу после передачи его в WindowsIdentity (в том же потоке, на котором он был создан.)

  4. Вы используете SqlConnection? Это пул поддерживает открытые ручки. Может быть, там что-то не так.

Возраст оттого, что у меня была проблема, когда я убирал дескриптор LogonUser поздно. Фактически, пользователь отключился, и ручка была закрыта автоматически. После этого я бы назвал CloseHandle тем, что, как я думал, было дескриптором. Однако слоты дескрипторов в .NET повторно используются. Они почти всегда действительны, но вы не можете определить, какой объект находится в данном слоте. Я фактически закрыл объекты пула SqlConnection непреднамеренно.

Смежные вопросы