【问题标题】:Why is there no Dispose function in Thread class为什么Thread类中没有Dispose函数
【发布时间】:2020-06-10 11:04:23
【问题描述】:

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

【问题讨论】:

  • 线程完成工作后会自动释放。
  • 可以调用Join等待线程完成
  • CloseHandle() 不会破坏、终止或挂起线程,它只会破坏句柄本身。线程继续正常工作。在 .NET 中,Thread 类派生自 CriticalFinalizerObject,因此内部句柄将被终结器关闭。
  • 你为什么要关心线程的句柄?
  • “操作系统线程何时关闭” - 您似乎很肯定 CLR 线程映射到操作系统线程。你验证了这个假设吗?

标签: c# multithreading winapi


【解决方案1】:

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

【讨论】:

  • 当 CLR 管理的 actual 线程被释放/创建?
  • @cassandrad 我不确定我是否遵循。这些线程没有什么特别之处。它们只是由 CLR 创建和管理。 IE。当不再需要线程时,CLR 将调用CloseHandle
  • 我明白这一点。对您是否知道 CLR 如何决定需要更多线程或应该停止某些线程感兴趣。从 CLR 源代码中找到这些信息似乎并不容易。
  • @cassandrad 这些显然是实现细节,所以不要依赖任何这些。但是,这里有两种不同的情况。 CLR 创建的线程来执行它需要,例如终结器线程和您的代码创建的线程。前者将根据 CLR 的需要运行。只要您分配给线程的代码运行(或线程由于某种原因终止),后者就会运行。之后,线程被清理,Thread 对象可以被回收。有时你会看到Thread 的实例在线程运行完成后仍在堆上。
猜你喜欢
  • 2011-12-25
  • 1970-01-01
  • 2010-10-12
  • 1970-01-01
  • 2014-03-06
  • 2017-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多