我正在用C#编写一个应用程序,利用SerialPort类与几个设备进行通信。现在我一直遇到的大问题是如何正确释放资源,因为当尝试使用已经被占用的串口时,会立即出现异常。
由于通常情况下垃圾回收器应该能够处理大部分工作,所以我已经没有其他想法可以尝试了...
主要我尝试了两种方法(按照我的逻辑应该可行)。我使用基于会话的通信,所以在每次通信之前和之后调用OpenPort和ClosePort方法 - 因此端口应该已经关闭。另外,我试过将包含端口的对象设置为空 - 但是我仍然一直得到UnauthorizedAccessExceptions异常 - 尽管我100%确定已经调用了SerialPort.Close()方法。
你们知道更好的释放端口的方法吗,这样我就不会再遇到那个异常了吗?
编辑: 感谢回答,但Dispose()方法并没有起作用 - 我之前也尝试过 - 也许我做错了什么,所以这里有一个示例,看看我的代码是什么样子的:
它实际上很像Øyvind建议的,虽然我只是添加了IDisposable - 但也没用:
这将是我的包装类:
现在每当我需要进行RS232通信时,我会像这样调用一个新的实例:
但这并没有改变什么 - 我仍然会收到许多UnauthorizedAccessExceptions错误 - 如果那个人是正确的(即SerialPort类的Dispose()方法只包含SerialPort.Close()),那么我猜我从我的早期方法中并没有真正改变任何东西,其中有一个函数调用close(); 感谢您的回答 - 仍然希望找到解决方案 :)
由于通常情况下垃圾回收器应该能够处理大部分工作,所以我已经没有其他想法可以尝试了...
主要我尝试了两种方法(按照我的逻辑应该可行)。我使用基于会话的通信,所以在每次通信之前和之后调用OpenPort和ClosePort方法 - 因此端口应该已经关闭。另外,我试过将包含端口的对象设置为空 - 但是我仍然一直得到UnauthorizedAccessExceptions异常 - 尽管我100%确定已经调用了SerialPort.Close()方法。
你们知道更好的释放端口的方法吗,这样我就不会再遇到那个异常了吗?
编辑: 感谢回答,但Dispose()方法并没有起作用 - 我之前也尝试过 - 也许我做错了什么,所以这里有一个示例,看看我的代码是什么样子的:
它实际上很像Øyvind建议的,虽然我只是添加了IDisposable - 但也没用:
这将是我的包装类:
class clsRS232 : IDisposable
{
public void clsRS232()
{
Serialport port = new Serialport("COM1",9600,Parity.none,8,Stopbits.one);
}
public void openPort()
{
port.Open();
}
public void sendfunc(string str)
{
port.Write(str);
}
public string readfunc()
{
port.ReadTo("\n");
}
public void Dispose()
{
port.Dispose();
}
}
现在每当我需要进行RS232通信时,我会像这样调用一个新的实例:
clsRS232 test = new clsRS232;
test.openport();
test.sendfunc("test");
test.Dispose();
但这并没有改变什么 - 我仍然会收到许多UnauthorizedAccessExceptions错误 - 如果那个人是正确的(即SerialPort类的Dispose()方法只包含SerialPort.Close()),那么我猜我从我的早期方法中并没有真正改变任何东西,其中有一个函数调用close(); 感谢您的回答 - 仍然希望找到解决方案 :)