Ada*_*son 5 .net c# debugging multithreading
我在开发的一个小应用程序中遇到了高度的闪烁和UI滞后,以测试我为我们的某个应用程序编写的组件.因为在空闲时间(当应该 - 严重 - 没有任何事情发生)时发生闪烁和滞后,我决定做一些调查.我注意到Threads窗口中有一些我不知道的线程(并非完全出乎意料),但引起我注意的是其中一个线程设置为Highest优先级.Main()即使在我的任何代码执行之前,也会调用此线程.我发现这个线程似乎出现在我编写的每个.NET应用程序中,甚至是控制台应用程序中.
作为我的大胆灵魂,我决定冻结线程,看看发生了什么.闪烁确实停止了,但在进行数据库交互时我遇到了一些奇怪的问题(我使用的是SQL CE 3.5 SP1).我的想法是,这可能是数据库实际运行的线程,但考虑到它是在应用程序加载时(在对数据库的任何引用之前)启动并且存在于其他非数据库应用程序中,我倾向于相信事实并非如此.
因为这个线程(像其他几个)在Location列中没有数据而且在暂停时我在调试器中切换到它时没有列出Call Stack,我尝试通过GetCurrentProcess()匹配StartAddress属性.相应线程的线程,但它超出了所有当前加载的模块地址范围.
有谁知道这个线程是什么,或者我怎么知道?
编辑
在进行一些挖掘之后,看起来StartAddress位于kernel32.dll中(基于附近的内存内容).这使我认为这只是用于启动线程的标准系统函数,根据这个页面,这基本上使我回到正方形,直到确定这个线程实际来自哪里.这一事实进一步证实了这个列表中的所有线程都具有相同的StartAddress值,这使我准确地询问目的是什么......?
编辑2
Process Explorer让我得到一个实际有意义的起始地址.它看起来像是mscorwks.dll!CreateApplicationContext+0xbbef.这个DLL在%WINDOWS%\ Microsoft.NET\Framework\v2.0.50中,所以看起来它显然是一个运行时程序集.我还不确定为什么
您可以尝试使用Sysinternals. Process Explorer让你深入挖掘.右键单击Process以访问Properties.然后"线程"选项卡.在那里,您可以看到线程的堆栈和模块.
编辑:
在询问一些之后,似乎你的"最高"优先级线程是Finalizer由于垃圾收集而运行的线程.我仍然没有充分的理由知道它为什么会一直运行.也许你的过程中有一些时髦的对象生命周期行为?