2016-08-27 7 views
-3

私はTelescopeと呼ばれる大きなパブリッククラスを持っています。私は新しいフォーム(form1.cs)を作成しました。クラスが持つ公の空白のいくつかを呼び出したいと思います。C#フォームから既存のクラスを呼び出す

私はその後、私はすべてのメソッドを参照することができ、クラスに

Telescope controls = new Telescope(); controls.CommandString("Gs#",true);

を初期化する形でこのような何かを行うが、クラスがすでに初期化されているとして、それが実行に失敗し、そこにあります既存のシリアルポート接続が進行中であるため、シリアルポート接続がないことを報告します。

助けが必要ですか? 新しいフォームから既存のメソッドを使用するにはどうすればよいですか?私はそれが動作(望遠鏡クラスである)Driver.csでのCommandStringを使用する場合

望遠鏡クラスは

public string CommandString(string command, bool raw) 
{ 
    CheckConnected("CommandString"); 
    serialPort.ClearBuffers(); 
    serialPort.Transmit(command); 
    return serialPort.ReceiveTerminated("#"); 

} 

Driver.cs

です。

************** Exception Text ************** 
ASCOM.NotConnectedException: CommandString 
+0

これは機能します。今あなたの望遠鏡のクラスで正確に何が起こり、それがなぜ機能しないのかは、あなたがコードを公開しない限り知ることができます。 –

+0

@IvanIčin彼はシリアルポートに接続しようとしています...これはC#の範囲外です。しかし、通信ポートは一度に1つの接続しか維持できません。 –

+0

待って、私はシリアルポートに再度接続したくありません。私はちょうど既存の接続を利用したい。投稿を編集させてください – evans

答えて

0

理想的には、とのインターフェースに裸の最低限のメソッドを含むインタフェースを実装し、いくつかのIoCコンテナの並べ替えや、あなたのクラスを使用することになります。それは、私は例外を取得Form1.csのから

を動作しません。あなたのシリアル接続。 IoCコンテナはインスタンスの存続期間をシングルトンとして管理し、インタフェースを解決するすべての要求に対して既存のインスタンスを戻します。

シリアルポートにアクセスできるのは1つのインスタンスだけなので、これらのメソッドを静的なクラスに移動できます...しかし、静的メソッドの共有を開始すると、予期しないバグが発生する可能性があるので注意してください。 コードの構造によっては、シリアル接続のみを静的にしたい場合があります。

これはクラスで実装することができる方法の一例:あなたはあなたのアプリケーションのどこかに望遠鏡クラスのあなたの最初の(そして唯一の)インスタンスへの参照を保持し、その参照によってそれにアクセスする必要があり

private Lazy<SerialConnection> _serialConnection =new Lazy<SerialConnection>(StaticClass.GetStaticSerialConnection); 
public SerialConnection MySerialConnection 
{ 
    get { return _serialConnection.Value; } 
} 
+0

詳細については投稿を修正しました。私はそれがあいまいであり、解決はより簡単であると思う – evans

+0

@evans私は私の答えが質問を正しく覆うと信じる。問題は、1つの通信ポートで2つのシリアル接続を開くことができないことです。たとえば、パテを開いてポートに接続しようとすると、それも失敗します。何らかの形で通信接続を共有する必要があります。 –

0

。参照はいくつかの静的クラスに保持することができ、そこで初期化し、常にその静的クラスを使用して呼び出すことができます。

+0

スタティックのようなインスタンスを扱い、スタティックのように渡すことと、メソッドをスタティックとして使うことの違いは何ですか? –

関連する問題