解决 如何关闭/删除/处置对象

眨眼

会员
已加入
2020年10月21日
留言内容
7
编程经验
Beginner
我有一个创建并打开串行端口的类:
C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO.Ports;
namespace ObservatoryControl
{
    public static class ObservatoryPortProvider

    {

        private static SerialPort ObservatoryCompPort = null;

        public static  SerialPort GetObservatoryComPort(string SelectedComPort)

        {

            if (ObservatoryCompPort == null)
            {

                ObservatoryCompPort = new SerialPort();

                ObservatoryCompPort.PortName = SelectedComPort;

                ObservatoryCompPort.Open();

            }

            return ObservatoryCompPort;

        }

        public static void CloseObservatoryComPort()

        {

            if (ObservatoryCompPort != null)
            {

                ObservatoryCompPort.close(); //I'm just guessing there is close method

                ObservatoryCompPort = null;

            }

        }


    }
}

然后,我调用GetObservatoryComPort方法创建对象:
C#:
 private void BtnConnect_Click(object sender, EventArgs e)
        {
            string SelectedComPort = (string)ListBoxSerialPorts.SelectedItem;
            ObservatoryComPort = ObservatoryPortProvider.GetObservatoryComPort(SelectedComPort);

          
            if (ObservatoryComPort.IsOpen)            {
                
                MyTimer.Interval = 1000;
                MyTimer.Tick += new EventHandler(MyTimer_Tick);
                MyTimer.Start();               

            }
                

        }

我的问题是,如果用户再次单击连接按钮,则会创建2个ObservatoryComPort实例-如何阻止这种情况发生?我想要类似ObservatoryComPort的东西!
 

附件

  • 1603369323270.png
    1603369323270.png
    50.9 KB · 观看次数 : 3

眨眼

会员
已加入
2020年10月21日
留言内容
7
编程经验
Beginner
弄清楚了-我发现我实际上在做的是创建第二个计时器对象,该对象正在填充列表框,这意味着它为每个计时器填充了两次1,而不创建第二个端口!
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,499
地点
弗吉尼亚州切萨皮克
编程经验
10+
I would caution against using a singleton static member like your ObservatoryPortProvider.ObservatoryComPort. As you observered if your provider's ObservatoryPortProvider.GetObservatoryComPort() gets called multiple times, only the last one will be closed by a call to ObservatoryPortProvider.CloseComPort. Presumably you would need one COM port to control the azimuth of the dome, and another one to control the opening/closing of the shutters, and one or more COM ports to control the azimuth and altitude of the telescope.

我也要注意 蓝精灵命名约定 你陷入。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,499
地点
弗吉尼亚州切萨皮克
编程经验
10+
以下只是我试图减轻压力和娱乐的方法。这并不是要让您失望的是如何设计事物。只是我在做"在餐巾纸上绘图"我将如何采用主要由域驱动的设计来控制各种串行端口。
Screenshot_1.png
 

眨眼

会员
已加入
2020年10月21日
留言内容
7
编程经验
Beginner
感谢您的答复-我将按照您的要求进行更改,至少要遵循命名约定,至于串行端口,我将永远只有1个串行端口。我正在与Arduino通信,它将控制开关打开/关闭天文台屋顶。
 

附件

  • Ascom Choooser.JPG
    Ascom Choooser.JPG
    44.4 KB · 观看次数 : 5
  • Ascom仿真器.JPG
    Ascom仿真器.JPG
    48.7 KB · 观看次数 : 5
最佳 底部