我正在用c#编写一个应用程序,利用SerialPort该类与一些设备进行通信.现在我遇到的最大问题是如何在那里正确释放资源,因为在尝试使用已经使用的串口时会立即出现异常.
由于通常GC应该处理大部分工作,我有点想法还有什么可以尝试...
主要是我尝试了两件事(按照我的逻辑)应该做的工作.我使用基于会话的通信,所以我在每次通信之前和之后调用一个OpenPort和一个ClosePort方法 - 所以应该关闭端口.此外,我已经尝试将包含端口的对象设置为null - 但我仍然得到UnauthorizedAccessExceptions所有时间 - 尽管我百分之百确定该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();
}
}
Run Code Online (Sandbox Code Playgroud)
现在每当我需要rs232通信时,我都会调用这样一个新实例:
clsRS232 test = new clsRS232;
test.openport();
test.sendfunc("test");
test.Dispose(); …Run Code Online (Sandbox Code Playgroud) 嘿!我的问题的根源是带有 tablelayoutpanel 的表单 - 据我所知,每个单元格只允许一个元素。现在,一个单元格包含一个调整大小的文本框。在此文本框的顶部,我必须放置一些图片框(只是文本中的一些图片 - 并且不可能将它们作为真实图片放置在 Richtextbox 中)。现在,虽然 tablelayoutpanel 的概念只允许每个单元格一个元素,但我在想也许在绘制表单后,可以在上面放置另一个元素 - 只需从代码创建一个 picbox 即可:
PictureBox pb = new PictureBox();
pb.Size = new System.Drawing.Size(49,49);
pb.Location = new Point(20,20);
this.controls.Add(pb);
Run Code Online (Sandbox Code Playgroud)
现在这不起作用......有什么想法如何绕过这个问题吗?谢谢你的帮助!!!!!
问候,
洛伦兹