稍微偏离主题:您可以使用任务而不是裸线程来运行函数,而无需担心处置。
这里有多个问题:
- 将变量设置为 null 不会删除任何内容,它只会删除对您的实例的引用。
- 只有当垃圾收集器决定收集您的实例时,才会调用析构函数。垃圾收集器很少运行,通常仅在它检测到内存压力时运行。
- 垃圾收集器只收集孤立的集合。孤立意味着您的对象指向的任何引用都是无效的。
您应该实现 IDisposable 接口并在 Dispose 方法中调用任何清理代码。C# 和 VB 提供了using
使处理更容易的关键字,即使在遇到异常时也是如此。
典型的 IDisposable 实现类似于以下内容:
class MyClass:IDisposable
{
ClassB _otherClass;
...
~MyClass()
{
//Call Dispose from constructor
Dispose(false);
}
public void Dispose()
{
//Call Dispose Explicitly
Dispose(true);
//Tell the GC not call our destructor, we already cleaned the object ourselves
GC.SuppressFinalize(this);
}
protected virtual Dispose(bool disposing)
{
if (disposing)
{
//Clean up MANAGED resources here. These are guaranteed to be INvalid if
//Dispose gets called by the constructor
//Clean this if it is an IDisposable
_otherClass.Dispose();
//Make sure to release our reference
_otherClass=null;
}
//Clean UNMANAGED resources here
}
}
然后,您可以像这样使用您的课程:
using(var myClass=new MyClass())
{
...
}
一旦using
块终止,即使发生异常,也会调用 Dispose()。