我几年前正在开发一个c#多线程应用程序。几天前我注意到,在它运行时,它会不断创建新的工作线程(几乎每秒一次)。使用Visual Studio 2013“线程”窗口这些线程没有名称和位置“不可用”,所以我无法检查这些线程的起始位置。 我为我的代码中生成的所有线程命名,但仍然使用“无名称”创建这些线程,所以我猜它们可能是由外部程序集生成的。
我的应用程序集成了NLog.dll(用于登录到txt文件),System.Data.SQLite.dll(用于数据读取和写入db3数据库)。它还使用UDP和TCP sokets进行数据交换。
示例: 运行2分钟后,我有70个线程。然后,20分钟后线程数为190!如果我在Visual Studio中检查Threads窗口,我看到所有新线程都有“Category”“Worker Thread”和“Name”是“No Name”。
这是我的Visual Studio Threads窗口的快照:
答案 0 :(得分:0)
我会从SysInternals工具包(www.sysinternals.com/)尝试Process Monitor。 ProcMon有一个用于线程活动事件的过滤器。
答案 1 :(得分:0)
这种线程(名称"无名称"位置为"不可用")由Timer
对象创建(在我的情况下为System.Windows.Forms.Timer
)。线程泛滥是由这行代码引起的:
timerUpdateStatus.Change(0, 0);
在Tick
事件处理程序中调用,然后通过另一个Change
方法调用将其重置为正确的值:
timerUpdateStatus.Change(statusUpdateTime, 0);