我在C#中有一个类,我想在我的课程处理时正确地关闭一些通信端口.但是,退出程序时永远不会调用终结器.这是为什么?难道我做错了什么?
我正在手动调用dispose,它会通过并关闭所有通信.这也没有解雇.
这是我正在使用的终结器:
~Power()
{
Dispose(false);
}
Run Code Online (Sandbox Code Playgroud)
终结器(这是你在这里使用的)仅在结束阶段被调用,这将在GC期间发生.
如果正确实现IDisposable,则永远不应该调用它.我在IDisposable系列中详细介绍了这一点.
话虽这么说,如果你的"通信端口"是通过托管类处理的,你根本不应该使用终结器.这增加了开销,对您没有任何帮助.只需实现IDisposable(正确),并让端口类的托管包装器在需要时处理终结.
如果一棵树落在森林里,周围没有人听到,它会发出声音吗?确保它确实:
using System;
class Program {
static void Main(string[] args) {
new Test();
}
}
class Test {
~Test() { Console.Beep(); }
}
Run Code Online (Sandbox Code Playgroud)
程序终止时留下的任何对象的终结器在进程终止之前被调用.这种情况不会发生的唯一方法就是当这个过程被粗暴地中止时.例如,Environment.FailFast().
C#终结器不能保证在任何特定时间被调用。不应将它们误认为C ++析构函数。
如果要保证可预测的处置,请实现IDispose并在using块中实例化您的类:
using (Power power = new Power())
{
// blah blah
}
Run Code Online (Sandbox Code Playgroud)
如果using块不切实际,则实现IDispose-您必须编写一个Dispose方法,该方法可以处理需要释放的所有资源。有关所有确切要求,请参见MSDN在线-并在适当的时间显式调用Dispose()。如果您是多线程的,则可能需要一些同步代码以确保不会太早发生。
| 归档时间: |
|
| 查看次数: |
4936 次 |
| 最近记录: |