从c#表单

时间:2016-08-27 08:58:55

标签: c# .net ascom

我有一个名为Telescope的大型公共课。我创建了一个新表单(form1.cs),我想调用该类的一些公共空白。

我在表单中做了类似的事情来初始化类

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

之后我可以看到所有的方法但是它在执行失败,因为类已经初始化并且现有的串口连接正在进行中,因此它报告没有串口连接。

有任何帮助吗? 如何使用新表单中的现有方法?

望远镜类在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

2 个答案:

答案 0 :(得分:0)

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

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

如何在课堂上实现这一点的一个例子:

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

答案 1 :(得分:0)

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