-3

を呼び出した大規模な公開クラスがありTelescopeます。新しいフォーム ( form1.cs) を作成しました。クラスが持つ public void の一部を呼び出したいと思います。

クラスを初期化するためにフォームでこのようなことをします

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

その後、すべてのメソッドを確認できますが、クラスが既に初期化されており、既存のシリアル ポート接続が進行中であるため、実行に失敗します。そのため、シリアル ポート接続がないと報告されます。

何か助けはありますか?新しいフォームから既存のメソッドを使用するにはどうすればよいですか?

Telescope クラスは Driver.cs にあります

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

}

Driver.cs (望遠鏡クラスがある場所) で CommandString を使用すると、機能します。form1.cs からは機能しません

例外があります:

************** Exception Text ************** 
ASCOM.NotConnectedException: CommandString
4

2 に答える 2

0

Telescope クラスの最初の (そして唯一の) インスタンスへの参照をアプリのどこかに保持し、その参照によってアクセスする必要があります。参照はいくつかの静的クラスに保持できます。そこで初期化して、常にその静的クラスを使用して呼び出すことができます。

于 2016-08-27T09:35:33.107 に答える
0

理想的には、ある種の IoC コンテナーを使用し、クラスは、シリアル接続とやり取りするための最小限のメソッドを含むインターフェイスを実装します。次に、IoC コンテナーはインスタンスの有効期間をシングルトンとして管理し、インターフェイスを解決するためのすべての要求で、既存のインスタンスを返します。

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

これをクラスに実装する方法の一例:

private Lazy<SerialConnection> _serialConnection =new Lazy<SerialConnection>(StaticClass.GetStaticSerialConnection);
public SerialConnection MySerialConnection
{
  get { return _serialConnection.Value; }
}
于 2016-08-27T09:09:48.723 に答える