我正在编写一小段代码,用于确定计算机上哪些串口可以自由连接。这是通过循环不同的串行端口并调用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 :(得分: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()
会为您执行此操作。
答案 1 :(得分:0)
我会在try中声明SerialPort
(在for循环中)并在其上使用using()语句。您希望为要访问的每个端口使用不同的SerialPort
实例。
答案 2 :(得分:0)
你不需要在循环中声明serialport,但你需要在那里重新实例化(即新的SerialPort())
这里有另一个例子:
http://www.gamedev.net/community/forums/topic.asp?topic_id=525884