1

私は ASCOM 望遠鏡ドライバーを作成しています。クライアント アプリケーションが適切に切断されなかったり、クラッシュしたりしたときに、いくつかのシリアル ポート コマンドがスコープに送信され、スコープの移動を停止することを保証する必要があります。

このようなファイナライザーを追加してみました

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

SendSerialPortCommand() メソッドに到達し、実際にバイトをネットワーク上に送信せずに終了し、lock ステートメントの直前で終了したように見えます。

レポはここで見ることができます

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

ファイナライザーは driver.cs にあり、呼び出されたメソッドは static クラス Common にあります

これを達成するためのより良い、またはより信頼できる方法はありますか?

4

4 に答える 4

4

IDisposableインターフェイスを実装し、Dispose メソッドで作業を行います。

Greg Beech の記事: IDisposable インターフェイスの実装と使用を参照してください。

デストラクタの代わりに、.NET には、基本オブジェクト クラスで定義された Finalize メソッドをオーバーライドすることによって実装されるファイナライザがあります (ただし、C# では、これに C++ デストラクタ構文 ~Object をやや混乱させて使用します)。オブジェクトが Finalize メソッドをオーバーライドすると、スコープ外のときに GC によって収集されるのではなく、GC はそれをファイナライザー キューに配置します。次の GC サイクルでは、キュー上のすべてのファイナライザーが (現在の実装では単一のスレッドで) 実行され、ファイナライズされたオブジェクトのメモリが回収されます。このことから、ファイナライザーでクリーンアップを実行したくない理由は明らかです。オブジェクトを収集するのに 1 回ではなく 2 回の GC サイクルが必要であり、他のすべてのスレッドが中断されている間にすべてのファイナライザーが実行される単一のスレッドがあるため、パフォーマンスが低下します。

したがって、デストラクタがなく、クリーンアップをファイナライザに任せたくない場合、唯一のオプションは手動で決定論的にオブジェクトをクリーンアップすることです。この機能をサポートするための標準を提供し、オブジェクトのクリーンアップ ロジックを配置する単一のメソッド Dispose を定義する IDisposable インターフェイスを入力します。finally ブロック内で使用すると、このインターフェイスはデストラクタと同等の機能を提供します。コードで finally ブロックを使用する主な理由は、IDisposable インターフェイスをサポートするためです。これが、C++ が単純に try/except を使用する理由です。これは、デストラクタを使用する finally ブロックが必要ないためです。

于 2012-08-10T05:19:04.593 に答える
1

アプリケーションを監視し、アプリケーションが終了またはクラッシュしたときに再起動するサービスを作成できます。

于 2012-08-10T05:21:23.303 に答える
0

IDisposable を実装することは、API にとって非常に良い考えです。
また、ドライバーと ASCON の間にあるプロキシ サービスを作成することも検討します。
タスク マネージャーによる安全でない停止は、依然として不適切な停止につながる可能性があります。

于 2012-08-10T05:59:16.003 に答える
0

OK、問題は、マネージ C# ASCOM ドライバーがアンマネージ C++ アプリケーションによって使用されていることでした。このアプリケーションは、Connected プロパティを false に設定してから終了すると、ドライバーから適切に切断されないため、C# ファイナライザーを使用してこのケースをキャッチしようとしていました。おそらくシャットダウンコードで管理対象オブジェクトを参照して、機能しなかったスコープを停止します。

回避策は、 appdomain.currentdomain.processexit イベントを使用して、ファイナライザー/デストラクタが実行される前にシャットダウン コードを実行することでした。

于 2012-08-10T22:43:02.450 に答える