我正在编写一个ASCOM望远镜驱动程序,我需要保证在客户端应用程序无法正确断开连接或崩溃时,会向该范围发送一些串行端口命令,以阻止该范围移动。
我尝试添加一个终结器,如下所示
~Telescope()
{
Common.AbortSlew();
Common.SetTracking(false);
}它转到SendSerialPortCommand()方法,然后退出,实际上并没有在线路上发送字节,并且似乎就在lock语句之前退出。
可在此处查看存储库
http://code.google.com/p/ascom-nexstar-telescope/source/browse/NexStar/
终结器位于driver.cs中,调用的方法位于静态类Common中
有没有更好或更可靠的方法来实现这一点?
发布于 2012-08-10 13:19:05
实现IDisposable接口并在Dispose方法中完成工作。
你应该看看这篇来自Greg Beech的文章:Implementing and using the IDisposable interface
而不是析构函数,.NET有终结器,这些终结器是通过覆盖在基本对象类上定义的Finalize方法实现的(尽管C#对此有点混乱地使用了C++析构函数语法~Object )。如果一个对象覆盖了Finalize方法,那么当它超出作用域时,GC不会收集它,而是将它放在终结器队列中。在下一个GC周期中,队列上的所有终结器都将运行(在当前实现中的单个线程上),并回收已完成对象的内存。这就是为什么你不想在终结器中进行清理的原因:收集对象需要两个GC周期,而不是一个,而且有一个线程,所有终结器都在运行,而其他线程都挂起了,所以这会影响性能。
因此,如果您没有析构函数,并且您不想将清理工作留给终结器,那么唯一的选择就是手动、确定性地清理对象。进入IDisposable接口,该接口提供了支持此功能的标准,并定义了单个方法Dispose,您可以将该方法放入对象的清理逻辑中。当在finally块中使用时,此接口提供与析构函数等效的功能。在代码中使用finally块的原因主要是为了支持IDisposable接口;这就是为什么C++只使用try/except,因为不需要使用带有析构函数的finally块。
发布于 2012-08-10 13:21:23
您可以编写一个服务来监视您的应用程序,并在它退出或崩溃时重新启动。
发布于 2012-08-10 13:59:16
实现IDisposable对于你的应用编程接口来说是一个非常好的主意。
我也会考虑在你的驱动程序和ASCON之间写一个代理服务。
通过任务管理器的不安全停止仍然可能导致错误的停止。
https://stackoverflow.com/questions/11895833
复制相似问题