如何知道哪个方法启动了工作线程

时间:2016-12-28 09:44:05

标签: c# multithreading

我几年前正在开发一个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窗口的快照:

snapshot of my Visual Studio Threads window 任何人都可以建议我如何找到这个线程泛滥的起源? 提前谢谢!

2 个答案:

答案 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);