我注意到在我的许多服务(使用多个线程)中,线程 ID 不断增加它们的值。这是麻烦的征兆吗?我是否以某种方式没有将它们返回到池中,或者这个值是否会增加正常行为?
2 回答
只要您的线程正在返回(而不是阻塞、等待、睡眠或无限循环),那么您就可以了。ManagedThreadId 只是一个唯一标识符,它根本不是“线程数”(http://msdn.microsoft.com/en-us/library/system.threading.thread.managedthreadid.aspx)
Thread.ManagedThreadId
一个整数,表示此托管线程的唯一标识符。
为确保您的线程正在返回,请在 VS 调试器中暂停您的进程并告诉它冻结所有线程并查看“线程”调试窗口。在运行时环境中,我会修改线程代码以增加锁定整数并在线程返回时减少相同的锁定整数(使用 try/finally 块来确保抛出的异常不会导致整数减量丢失) .
“正确”的答案是否定的,这不正常。不像CLR坏了。您的应用程序应该(大多数情况下,除非您有一些非常好的理由,我什至无法想象它可能是什么)谨慎使用 Thread 线程。如果您正在创建其他 100 个线程,那么您 99% 做错了。
您要么在应该重新使用它们的地方杀死线程,要么在使用线程线程的地方使用线程池线程。
编辑好。你可能不相信我。但 MSDN 也是这么说的:
ManagedThreadId 属性的值不会随时间变化,即使托管公共语言运行时的非托管代码将线程实现为纤程也是如此。
所以只是再次强调它(我在第一次尝试时没有说清楚)......你没有看到现有线程中的线程 ID 发生变化。你会看到不同的线程弹出(用你自己的话来说有数百个)......新线程得到新的 ID。旧线程不会更改其 ID。