2013-05-15 2 views
0

Мне нужно проверить наличие COM-портов в моей заявке:Самый быстрый способ проверки для COM-портов

Я создал два способа сделать это.

Метод 1:

public List<string> GetAllPortsForeach() 
{ 
    var allPorts = new List<string>(); 
    foreach (String portName in System.IO.Ports.SerialPort.GetPortNames()) 
    { 
      allPorts.Add(portName); 
    } 
    return allPorts; 
} 

Метод 2:

public List<string> GetAllPortsForLoop() 
{ 
     var allPorts = new List<string>(); 
     for (int i = 1; i <= 16; i++) 
     { 
      string comPortName = "COM" + Convert.ToString(i); 
      SerialPort sp = new SerialPort(comPortName); 
      try 
      { 
       sp.Open(); 
       allPorts.Add(comPortName);    
       sp.Close(); 
      } 
      catch 
      { 
      } 
     } 
     return allPorts; 
} 

Какой самый быстрый? Что я должен использовать и почему?

+0

Профиль и сообщите нам. В целом, чем больше встроенных функций вы используете в .net, тем лучше. – Serdalis

+0

Способ 1, потому что он не пытается открыть порты, что требует много времени. – dbasnett

ответ

3

Первый. Он считывает все доступные имена портов из реестра. Чтобы быть более точным, достаточно использовать SerialPort.GetPortNames, если вы не планируете добавлять в список произвольное имя порта.

2-й один:

  • ограничен номер порта (имя порта может быть «COM20», но общее число портов в системе будет, например, 4)
  • исключения на основе (это уродливо и медленнее).
+0

еще быстрее будет 'new List (SerialPort.GetPortNames())' или 'SerialPort.GetPortNames(). ToList()' Метод LINQ – fbstj

+1

@FallingBullets: он не будет, потому что 'List ' ctor на самом деле те же самые вещи внутри (конечно, если вы не вычисляете циклы процессора). В то же время исключения происходят очень медленно. – Dennis

+0

ОК, быстрее было неправильное слово, но это немного более чистый код. – fbstj