2010-09-01 26 views
1

我正在寫一小段代碼來確定計算機上的哪些串行端口可用於連接。這是通過循環訪問不同的串行端口並調用Open()方法完成的。如果發生異常,則表示該端口不可用。處置串行端口對象

但是,視覺工作室告訴我,我沒有正確處理對象,或者如果將dispose方法放置在finally塊中,則處理該對象的次數太多。 什麼是配置串口對象的最佳方式,在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(); 
    } 
+0

您的catch語句也應該只捕獲它可以處理的特定異常(對這兩個語句分別使用catch)。正如所寫,它拋棄了其他的例外。 – 2010-09-01 01:03:25

+0

如何處理isOpen [i] = false後的serialPort.Close() – kenny 2010-09-01 01:08:13

+0

我打算使用catch塊(可能不正確)的方式是爲一組異常執行一個公共塊代碼,而不是在每個塊中都使用相同的代碼。 – steeppham 2010-09-01 01:55:44

回答

3

相反,您可以使用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

通過使用'using'語句,您不必顯式調用dispose/close? – steeppham 2010-09-01 01:51:17

+1

@yeastbeast - 即使存在異常,using語句也會自動爲您調用Dispose()。這與使用try/finally完全相同 - 使用/閱讀更簡單。 SerialPort的Dispose()函數會爲你調用Close()。如果你喜歡,你仍然可以自己產生'Close()'(這是不必要的,但是無害的)。 – 2010-09-01 02:08:32

+0

下面是使用語句的鏈接:http://msdn.microsoft.com/en-us/library/yh598w02(VS.80).aspx – 2010-09-01 02:09:57

0

我將在try(for循環內)中聲明SerialPort並在其上使用using()語句。您希望爲您訪問的每個端口設置不同的SerialPort實例。

0

你不應該需要申報的循環中通過一個串口,但是你需要有重新實例它(即新的SerialPort())

這裏有一個例子:

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

+0

您不需要*,但是您應該儘量減少詞法範圍,並將其放入using()語句中以用於此特定示例。 – 2010-09-01 02:55:23