C# 为什么';t线程实现IDisposable?

C# 为什么';t线程实现IDisposable?,c#,multithreading,idisposable,finalizer,C#,Multithreading,Idisposable,Finalizer,我注意到System.Threading.Thread实现了一个终结器,但不是IDisposable。建议的做法是在实现终结器时始终实现IDisposable。杰弗里·里克特(Jeffrey Richter)表示,该指导方针“非常重要,应始终毫无例外地予以遵守” 那么为什么线程不实现IDisposable呢?实现IDisposable似乎是一个非破坏性的更改,它允许确定性地清理线程的可终结资源 还有一个相关的问题:既然线程是可终结的,我是否必须保留对正在运行的线程的引用,以防止它们在执行过程中被

我注意到System.Threading.Thread实现了一个终结器,但不是IDisposable。建议的做法是在实现终结器时始终实现IDisposable。杰弗里·里克特(Jeffrey Richter)表示,该指导方针“非常重要,应始终毫无例外地予以遵守”

那么为什么线程不实现IDisposable呢?实现IDisposable似乎是一个非破坏性的更改,它允许确定性地清理线程的可终结资源


还有一个相关的问题:既然线程是可终结的,我是否必须保留对正在运行的线程的引用,以防止它们在执行过程中被终结?

处理
线程
对象会做什么?这种情况下的“资源”有它自己的自然清理——线程整理。请注意,所有权感也缺失了。。。在执行线程中,您始终可以使用
thread.CurrentThread
,因此只有该线程才能真正声明任何类型的所有权


基本上,我认为
线程
是一种稍微不寻常的情况-底层资源有一个生命周期,但它不应该被明确地清理。

这可能是因为您无法处理线程。相反,你可以使用Abort()或类似的方法让它死掉。

这是一个设计问题,因此任何没有参与构建.NET这一方面的人都只能猜测。话虽如此,但有一个很好的观点:

…实现IDisposable不会有任何区别,至少在线程的当前实现中是如此。我增加了正在创建的线程的数量,并且句柄计数在某个点会下降,因此有一些机制可以关闭它们


线程自然会自行清理,因此它们不是典型意义上需要管理的资源。

可以,但通常情况下,使用Abort并不被视为良好做法-只需确保线程方法返回(使用bool或类似方法),系统会清理其余部分。由于ManagedThreadID是一个整数,甚至可以在线程启动之前读取,这表明在创建线程时分配了一些内容(即使只是数字本身)。虽然应用程序创建20多亿个线程对象会很奇怪,但ids似乎是一种值得发布的资源。@supercat:有趣的一点
ManagedThreadId
似乎是按顺序分配的-我不知道创建了20多亿个线程之后会发生什么。当线程对象符合终结条件时,这些ID似乎会被重用,所以我怀疑是线程。线程正在实现Finalize,但没有IDIsposable。我不确定这是否涵盖了它<代码>线程在许多情况下与
进程
类似,因为它只是本地资源的句柄,即操作系统线程进程实现IDisposable,那么为什么不
线程
?例如,两者都有终结器。