Утилизация объекта последовательного порта - PullRequest
1 голос
/ 01 сентября 2010

Я пишу небольшой фрагмент кода, который определит, какие последовательные порты на компьютере свободны для подключения.Это делается путем обхода различных последовательных портов и вызова метода Open ().Если возникает исключение, это указывает на то, что порт недоступен.

Однако, визуальные студии говорят мне, что я не избавляюсь от объекта должным образом, или слишком много раз удаляю его, если я помещаю метод dispose внаконец заблокировать.Каков наилучший способ избавиться от объекта последовательного порта, и разумно ли создать новый объект последовательного порта в for или оставить его как есть?

В разделе с комментариями с вопросительными знаками находятся биты, которыеЯ не уверен насчет.

    public static void QueryOpenPorts(out string[] portNames, out bool[] isOpen)
    {
         // serial port object used to query
        SerialPort serialPort = new SerialPort();
        // get valid ports on current computer
        portNames = SerialPort.GetPortNames();
        // number of valid ports
        int count = portNames.Length;
        // initialise isOpen array
        isOpen = new bool[count];

        // iterate through portNames and check Open()
        for (int i = 0; i < count; i++)
        {
            // set port name
            serialPort.PortName = portNames[i];
            // attempt to open port
            try
            {
                serialPort.Open();
                // port available
                isOpen[i] = true;
            }
            catch (Exception ex)
            {
                // serial port exception
                if (ex is InvalidOperationException || ex is UnauthorizedAccessException || ex is IOException)
                {
                    // port unavailable
                    isOpen[i] = false;
                }
            }
            finally
            {

                //    // close serial port if opened successfully ????????????
                //    if (serialPort.IsOpen)
                //    {
                //        serialPort.Close();
                //    }

            }
        }
        // release object ?????????
        // serialPort.Dispose(); 
    } 

Ответы [ 3 ]

3 голосов
/ 01 сентября 2010

Вместо этого вы можете использовать блок using.

using (SerialPort serialPort = new SerialPort(portNames[i]))
{
    try
    {
        serialPort.Open();
        isOpen[i] = true;
        // You could call serialPort.Close() here if you want. It's really not needed, though, since the using block will dispose for you (which in turn will close)
    }
    // This is a better way to handle the exceptions.
    // You don't need to set isOpen[i] = false, since it defaults to that value
    catch (InvalidOperationException) { }
    catch (UnauthorizedAccessException) { }
    catch (IOException) { }
}

Обратите внимание, что вам не нужно звонить Close(), так как Dispose() сделает это за вас.

0 голосов
/ 01 сентября 2010

Вам не нужно объявлять последовательный порт внутри цикла, но вам нужно его заново создать (т.е. новый SerialPort ())

Здесь есть еще один пример:

http://www.gamedev.net/community/forums/topic.asp?topic_id=525884

0 голосов
/ 01 сентября 2010

Я бы объявил SerialPort внутри try (внутри цикла for) и использовал в нем оператор using ().Вам нужен отдельный экземпляр SerialPort для каждого порта, к которому вы обращаетесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...