【问题标题】:guaranteeing code runs in C# finalizers保证代码在 C# 终结器中运行
【发布时间】:2012-08-10 05:13:56
【问题描述】:

我正在写一个ASCOM望远镜驱动,我需要保证几个串口 当客户端应用程序时,命令被发送到范围以阻止范围移动 无法正确断开连接或崩溃。

我尝试添加一个看起来像这样的终结器

~Telescope()
{
    Common.AbortSlew();
    Common.SetTracking(false);
}

它进入 SendSerialPortCommand() 方法,然后退出而不实际发送 字节在线路上,似乎在锁定语句之前退出。

repo 可以在这里查看

http://code.google.com/p/ascom-nexstar-telescope/source/browse/NexStar/

finalizer 在 driver.cs 中调用的方法在静态类 Common 中

有没有更好或更可靠的方法来实现这一点?

【问题讨论】:

    标签: c# serial-port destructor finalizer ascom


    【解决方案1】:

    实现IDisposable 接口并在 Dispose 方法中完成您的工作。

    您应该看到 Greg Beech 的这篇文章:Implementing and using the IDisposable interface

    .NET 有终结器,而不是析构函数,由 覆盖在基 Object 类上定义的 Finalize 方法 (尽管 C# 使用 C++ 析构函数语法有些混乱~Object 为了这)。如果一个对象覆盖了 Finalize 方法,那么而不是 当它超出范围时被 GC 收集,GC 将它放在 终结器队列。在下一个 GC 循环中,队列中的所有终结器 运行(在当前实现中的单个线程上)并且 从最终对象中回收的内存。从 这就是你不想在终结器中进行清理的原因:它需要两次 GC 循环收集对象而不是一个,并且有一个 在所有其他线程都运行时运行所有终结器的线程 暂停,因此会影响性能。

    所以如果你没有析构函数,并且你不想离开 清理到终结器,那么唯一的选择是手动, 确定性地清理对象。输入 IDisposable 提供支持此功能的标准的接口 并定义了一个单独的方法 Dispose,您将在其中进行清理 对象的逻辑。在 finally 块中使用时,此接口 提供与析构函数等效的功能。的原因 finally 代码中的块主要是为了支持 IDisposable 界面;这就是 C++ 只使用 try/except 的原因,因为没有必要 用于带有析构函数的 finally 块。

    【讨论】:

    • 谢谢,这确实帮助我更多地理解了这个问题,这个问题的根本原因是使用驱动程序的应用程序是非托管 C++ 而驱动程序是托管 C# 所以只有 ~Telescope() 只会曾经被调用,我无权通过将 Connected 属性设置为 false 来强制非托管 C++ 应用程序正确断开与驱动程序的连接。
    【解决方案2】:

    您可以编写一个服务来监控您的应用程序,并在应用程序退出或崩溃时重新启动。

    【讨论】:

      【解决方案3】:

      实现 IDisposable 对您的 API 来说是一个非常好的主意。
      我还会考虑在您的驱动程序和 ASCON 之间编写一个代理服务。
      通过任务管理器进行的不安全停止仍然可能导致错误停止。

      【讨论】:

        【解决方案4】:

        好的,问题是我的托管 C# ASCOM 驱动程序正被非托管 C++ 使用 通过设置 Connected 无法正确断开与驱动程序的应用程序 属性为 false 然后退出,所以我试图使用 C# 终结器来捕捉这种情况 并停止可能在关闭时引用托管对象的不起作用的范围 代码。

        解决方法是使用 appdomain.currentdomain.processexit 事件来运行我的关机 终结器/析构器运行之前的代码。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-08-22
          • 2016-04-17
          • 1970-01-01
          • 2021-09-22
          • 1970-01-01
          • 1970-01-01
          • 2021-04-05
          • 1970-01-01
          相关资源
          最近更新 更多