Я испытываю высокую степень мерцания и задержки 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, поэтому похоже, что это явно среда выполнения. Я до сих пор не знаю, почему
- это наивысший приоритет
- это, кажется, вызывает икоту в моем приложении
Поток Finalizer настроен на работу с наивысшим приоритетом. –