我有一个我编写的 .NET 4 Windows 服务,它定期(通常每天一次)通过串行端口与外部设备通信。总而言之,该服务运行良好,但对于一位客户来说,时不时地调用 会SerialPort.Open()
引发以下异常:
System.IO.IOException:系统资源不足,无法完成请求的服务。 在 System.IO.Ports.InternalResources.WinIOError(Int32 错误代码,字符串 str) 在 System.IO.Ports.SerialStream..ctor (字符串端口名,Int32 波特率,奇偶校验,Int32 数据位,StopBits stopBits,Int32 读取超时,Int32 写入超时,握手握手,布尔 dtrEnable,布尔 rtsEnable,布尔丢弃空,字节奇偶校验替换) 在 System.IO.Ports.SerialPort.Open()
基于异常,会认为服务器资源不足,但似乎并非如此。CPU 或多或少处于空闲状态,并且有足够的内存和磁盘。
网上有很多提到SerialPort.Open()
抛出其他 IOExceptions 并且我已经实现了Zach Saw 的 SerialPortFixer,但它似乎解决了一个不同的问题。
这是我正在做的一个例子(非常简化)。该类的几个实例(使用不同的串行端口名称)始终在内存中,然后每个实例大约每天调用一次 Run() 方法。
public class Collector
{
private SerialPort _port;
private string _portName;
public void Run()
{
try
{
// Run Zach Saw's IOException workaround
SerialPortFixer.Execute(_portName);
using (_port = new SerialPort(_portName, 9600, Parity.None, 8, StopBits.One))
{
_port.DataReceived += PortDataReceived;
_port.ErrorReceived += PortErrorReceived;
_port.Handshake = Handshake.None;
_port.DtrEnable = true;
_port.RtsEnable = true;
_port.Open();
// Do the stuff
_port.Close();
}
}
catch (Exception e)
{
// Handle exception
}
}
private void PortDataReceived(object sender, SerialDataReceivedEventArgs e)
{
// Do other stuff
}
private void PortErrorReceived(object sender, SerialErrorReceivedEventArgs e)
{
// Log error
}
}
任何帮助,将不胜感激。