2009-05-06 3 views
5

Я испытываю высокую степень мерцания и задержки UI в небольшом приложении, которое я разработал для тестирования компонента, который я написал для одного из наших приложений. Поскольку мерцание и запаздывание происходили во время простоя (когда должно быть - серьезно - ничего не происходит), я решил провести некоторое расследование. Я заметил несколько потоков в окне Threads, о которых я не знал (не совсем неожиданно), но то, что привлекло мое внимание, было одним из потоков, установленным в Highest приоритетом. Этот поток существует в то время, когда вызывается Main(), даже до того, как выполняется какой-либо из моих кодов. Я обнаружил, что этот поток присутствует во всех приложениях .NET, которые я пишу, даже в консольных приложениях.Определение источника потока

Будучи смелой душой, которой я являюсь, я решил заморозить нить и посмотреть, что произошло. Мерцание действительно прекратилось, но я испытал некоторую странность, когда дело дошло до взаимодействия с базой данных (я использую SQL CE 3.5 SP1). Я думал, что это может быть поток, на котором фактически работает база данных, но учитывая, что он запущен в момент загрузки приложения (до каких-либо ссылок на БД) и присутствует в других приложениях, отличных от базы данных, я склонен полагать, что это не так.

Поскольку эта нить (как и некоторые другие) отображается без данных в столбце «Местоположение» и не отображается список вызовов, если я переключился на нее в отладчике во время паузы, я попробовал сопоставить свойство StartAddress с помощью GetCurrentProcess(). для соответствующего потока, но он выходит за пределы всех диапазонов адресов загруженных модулей.

Кто-нибудь знает, что это за тема или как я могу узнать?

Редактировать

После выполнения некоторого копания, это выглядит как StartAddress в kernel32.dll (на основе близлежащим содержимого памяти). Это заставляет меня думать, что это просто стандартная системная функция, используемая для запуска потока, согласно this page, которая в основном возвращает меня на квадрат, насколько можно определить, откуда эта нить. Это также подтверждается тем фактом, что ВСЕ потоки в этом списке имеют одинаковое значение для StartAddress, что позволяет мне точно спросить, в чем цель ...?

Edit 2

Process Explorer позволяет мне на самом деле содержательный начальный адрес. Похоже, это mscorwks.dll!CreateApplicationContext+0xbbef. Эта DLL находится в% WINDOWS% \ Microsoft.NET \ Framework \ v2.0.50, поэтому похоже, что это явно среда выполнения. Я до сих пор не знаю, почему

  • это наивысший приоритет
  • это, кажется, вызывает икоту в моем приложении
+0

Поток Finalizer настроен на работу с наивысшим приоритетом. –

ответ

6

Вы можете использовать Sysinternals. Process Explorer давайте вам копать довольно глубоко. Щелкните правой кнопкой мыши процесс, чтобы получить доступ к свойствам. Затем вкладка «Темы». Там вы можете увидеть стек и модуль потока.

EDIT:

После asking вокруг некоторых, кажется, что ваш «Самый высокий» приоритет потока является Finalizer нить, которая из-за сборки мусора.У меня все еще нет веских оснований, почему он будет постоянно работать. Может быть, у вас есть какое-то смешное поведение жизни объекта в вашем процессе?

2

Я не уверен, что это, но если вы включите неуправляемого отладки , и настройте Visual Studio с помощью Windows symbol server, вы можете получить еще несколько подсказок.

+0

GC был чем-то, о чем я думал, но я не мог подумать, почему он будет настроен на Высшее (а не eve AboveNormal, но HIGHEST). –

+0

Я думал, что GC работает на низкоприоритетной теме. Где вы видели, как он работает на высокоприоритетной теме? –

+0

К сожалению, вы правы. Я уберу это. –

0

Может быть резьбой коллектора мусора. Я тоже это заметил, когда однажды изучал ошибку, связанную с финализатором. Возможно, ваша системная память низкая, и GC пытается собирать все время? Так было и в вышеупомянутой ошибке. Я не мог воспроизвести его на своей машине, но у моего коллеги была машина с меньшим объемом оперативной памяти, где она снова появлялась, как часы.

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