-3

我有一个名为Telescope. 我创建了一个新表单 ( form1.cs),我想调用该类的一些公共 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

理想情况下,您将使用某种 IoC 容器,并且您的类将实现一个接口,其中包含与您的串行连接接口的最小方法。然后,IoC 容器将作为单例管理实例的生命周期,并且在每次请求解析接口时,都会将现有实例传回给您。

由于情况可能并非如此,并且由于只有单个实例可以访问串行端口,因此您可以将这些方法移动到静态类中......但是要小心,当您开始共享静态方法时,可能会出现意外错误。根据代码的结构,您只希望串行连接是静态的。

如何在一个类中实现这一点的一个例子:

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

您应该在应用程序的某个位置保留对 Telescope 类的第一个(也是唯一一个)实例的引用,然后通过该引用访问它。引用可以保存在某个静态类中,您可以在那里对其进行初始化并始终使用该静态类调用它。

于 2016-08-27T09:35:33.107 回答