我有一个包含工作线程的对象.我想在对象超出范围时杀死线程.
using System.IO; using System; using System.Threading; namespace tt { class Program { static void Main() { AnotherClass a = new AnotherClass(); a.Say(); } } class AnotherClass:IDisposable { private bool m_Disposed; private readonly AutoResetEvent m_ResetEvent = new AutoResetEvent(false); public AnotherClass() { Thread t = new Thread(wait); t.Start(); } public void Dispose() { Dispose(true); } private void Dispose(bool disposing) { if (m_Disposed) { return; } if (disposing) { Console.WriteLine("inner disposing"); } m_ResetEvent.Set(); Console.WriteLine("Outer disposing"); m_Disposed = true; } private void wait() { m_ResetEvent.WaitOne(); } ~AnotherClass() { Dispose(false); } public void Say() { Console.WriteLine("HellO"); } } }
该程序将挂在那里,因为没有调用AnotherClass的析构函数.我知道我可以调用a.Dispose()来杀死线程.但有没有办法在对象超出范围时隐式杀死线程?
解决方法
不,那是不可能的.没有引用计数可以注意到该对象没有更多引用,因此在发生这种情况时无法执行任何操作.
IDisposable接口用于在不再使用实例时需要执行某些操作的类,并且调用Dispose方法是您发信号通知实例的方式.
在离开作用域时确保放置对象的常用方法是将代码包装在using块中:
static void Main() { using (AnotherClass a = new AnotherClass()) { a.Say(); } }
使用块是语法糖尝试…最后块:
static void Main() { AnotherClass a = new AnotherClass(); try { a.Say(); } finally { if (a != null) { ((Idisposable)a).Dispose(); } } }