C# 为什么线程类中没有Dispose函数

C# 为什么线程类中没有Dispose函数,c#,multithreading,winapi,C#,Multithreading,Winapi,在Win32 API世界中,有CreateThread()来创建线程,还有CloseHandle()来关闭线程句柄。但是在.NET框架中,System.Threading.Thread类没有Dispose()或Close()方法。我想知道,在.NET的情况下,操作系统线程何时关闭?垃圾收集期间?线程类的实例只是一个表示线程的托管对象。实际线程由CLR拥有和管理 Thread类的实例只是一个表示线程的托管对象。实际线程由CLR拥有和管理 线程完成工作后会自动释放。您可以调用Join等待线程完成Cl

在Win32 API世界中,有
CreateThread()
来创建线程,还有
CloseHandle()
来关闭线程句柄。但是在.NET框架中,
System.Threading.Thread
类没有
Dispose()
Close()
方法。我想知道,在.NET的情况下,操作系统线程何时关闭?垃圾收集期间?

线程类的实例只是一个表示线程的托管对象。实际线程由CLR拥有和管理

Thread类的实例只是一个表示线程的托管对象。实际线程由CLR拥有和管理

线程完成工作后会自动释放。您可以调用
Join
等待线程完成
CloseHandle()
不会销毁、终止或挂起线程,它只销毁句柄本身。线程继续正常工作。在.NET中,
Thread
类派生自
CriticalFinalizerObject
,因此终结器将关闭内部句柄。您为什么关心线程的句柄呢?“操作系统线程何时关闭”-您似乎肯定CLR线程映射到操作系统线程。您是否验证了该假设?线程完成其工作后会自动释放。您可以调用
Join
等待线程完成
CloseHandle()
不会销毁、终止或挂起线程,它只销毁句柄本身。线程继续正常工作。在.NET中,
Thread
类派生自
CriticalFinalizerObject
,因此终结器将关闭内部句柄。您为什么关心线程的句柄呢?“操作系统线程何时关闭”-您似乎肯定CLR线程映射到操作系统线程。你验证过这个假设吗?当CLR管理的
实际的
线程被释放/创建时?@cassandrad我不确定我是否遵循了这个假设。这些线没有什么特别之处。它们只是由CLR创建和管理的。也就是说,当不再需要线程时,CLR将调用
CloseHandle
。我理解这一点。我感兴趣的是您是否知道CLR是如何决定需要更多的线程或者应该暂停某些线程的。从CLR源代码中找到这些信息似乎不是那么容易。@cassandrad这些显然是实现细节,所以不要依赖这些。然而,这里有两种不同的场景。CLR创建的线程,如终结器线程和代码创建的线程。前者将根据CLR的需要运行多长时间。只要分配给线程的代码运行(或者线程因某种原因终止),后者就会运行。之后,线程被清理,可以回收
线程
对象。有时,您会看到
线程
的实例在线程运行完成后仍在堆上。当CLR管理的
实际
线程被释放/创建时?@cassandrad我不确定我是否遵循。这些线没有什么特别之处。它们只是由CLR创建和管理的。也就是说,当不再需要线程时,CLR将调用
CloseHandle
。我理解这一点。我感兴趣的是您是否知道CLR是如何决定需要更多的线程或者应该暂停某些线程的。从CLR源代码中找到这些信息似乎不是那么容易。@cassandrad这些显然是实现细节,所以不要依赖这些。然而,这里有两种不同的场景。CLR创建的线程,如终结器线程和代码创建的线程。前者将根据CLR的需要运行多长时间。只要分配给线程的代码运行(或者线程因某种原因终止),后者就会运行。之后,线程被清理,可以回收
线程
对象。有时您会看到
Thread
的实例在线程运行完成后仍在堆中。