某些 Microsoft 类实现“IsDispose”布尔值,指示某个类已释放。我继承了其中一些类,有时通过内部的 while(true) 循环从它们启动无头线程。通过检查类中的 IsDispose 是否设置为 True,将线程设置为终止。但这有多可靠?如果该类被释放,那么我是否会失去对位于已释放类内的属性“IsDispose”的访问权限?或者它会因为线程引用了“IsDispose”属性而保持未处置状态吗?
通过检查类中的
是否设置为 True,将线程设置为终止。但这有多可靠?IsDisposed
它是不可靠的,除非该类被明确记录为线程安全的。在多线程环境中访问非线程安全类的任何成员而不进行同步是一种技术违规,并会导致程序出现未定义的行为。从快速浏览文档来看,大多数配备
IsDisposed
属性的类都没有记录为线程安全的。例如,类 System.Windows.Forms.Control
(以及从它派生的 20 多个类)被记录为只有几个线程安全成员,而 IsDisposed
不是其中之一:
只有以下成员是线程安全的:
、BeginInvoke
、EndInvoke
、Invoke
和InvokeRequired
(如果已创建控件的句柄)。CreateGraphics
所以在UI线程(创建该类实例的线程)以外的任何线程中读取该类的
IsDisposed
既不可靠也不被允许。
System.Runtime.Caching.ChangeMonitor
被记录为完全线程安全的:
该类型是线程安全的。
所以你可以在任何线程中检查这个类的
IsDisposed
而不需要同步,而且这样做是可靠的。
对于在其文档中没有提及线程安全的类,您应该假设它们是不是线程安全的。