这个问题困扰我很久,网上搜了也找不到解决方法,尝试过各种方法:SerialPort.Close()、SerialPort.Dispose()、重写SerialPort的Dispose()方法、捕获掉口事件,然后执行Close() 等等等
最后在github上找到一个咨询帖:
SerialPort The Requested Resource is in Use
总结一下:SerialPort内部有个BaseStream 属性
public System.IO.Stream BaseStream { get; }
SerialPort对象在Open()后Close()前掉口,内部的BaseStream并未关闭,但由于掉口,SerialPort对象无法访问,因此无法通过SerialPort.BaseStream.Dispose()关闭IO流,所以下次端口出现后,使用SerialPort.Open()就会提示“请求的资源在使用中”
解决办法:
class MyPort
{
private Stream portBaseStream;
private SerialPort ComPort;
public MyPort(...)
{
Comport = new SerialPort(...);
}
public bool Open()
{
try
{
if(!ComPort.IsOpen)
{
try
{
portBaseStream?.Dispose();
}
catch{}
ComPort.Open();
portBaseStream = ComPort.BaseStream;
}
return true;
}
catch
{
return false;
}
}
...Close Send等方法
}
//使用时
MyPort port = new Myport(...);
port.Open();