我有一个产生另一个UI线程的类并且做了它。我需要中止该线程并在我的父类被销毁时清理。那么我如何知道我的父类何时被毁坏?
来自C ++我首先想到的是将它放在析构函数中。但是C#并没有任何析构函数 - 只有终结器和处理器 - 根据我的理解 - 可能会也可能不会被调用(我猜这对于GC来说是一种心情?)。
这非常简单 - 如果您可能想要或不想释放您的资源。
但是,只要对象被销毁,你在哪里放置绝对必须执行的代码?
答案 0 :(得分:5)
您将其放入Dispose
(实现IDisposable
接口),然后确保在不再需要该对象时调用Dispose
。有一种语言结构可以做到这一点:
using (var foo = new Foo())
{
// Do something with foo.
}
foo.Dispose
将在using
块的末尾调用。这相当于:
{
var foo = new Foo();
try
{
// Do something with foo.
}
finally
{
foo.Dispose();
}
}
请注意,当对象离开作用域时,Dispose
会自动调用 ;你需要自己动手,使用using
块或明确地调用它。
但是,您应该在Foo
中提供一个调用Dispose
的终结器,这样如果在GC到达之前没有丢弃该对象,则不会留下未发布的资源:
~Foo()
{
Dispose();
}
IDisposable
模式背后的想法是它明确告诉你类何时需要处理。 Here's an article描述了如何正确实现它(考虑可能的后代类)。
答案 1 :(得分:3)
当一个物体被摧毁时,没有办法保证“绝对正确[将]执行”的东西(尝试拔掉你的PC上的插头 - 终结者不会被召唤)
你可以期待的最好的是终结器 - 使用C ++析构函数语法在C#中定义。虽然,您最好实现IDisposable,并使用using{}
块。
答案 2 :(得分:1)
尽管使用此方法并不常见,但您可以使用~
字符在C#中定义“析构函数”,如下所示:
class Parent
{
~Parent() // destructor
{
// cleanup statements...
}
}
注意:
析构函数隐式调用了基类的Finalize 对象
(source)
答案 3 :(得分:0)
您将课程设为Component
,将课程设为Container
。
请参阅:C# - What is a component and how is it typically used?
其他答案似乎忙于“超出范围”用例。但“每当我的父类被摧毁”时?如果“父类”是“包含对象”,则组件 是正确的工具。