我编写了一个 .NET 4 Windows 服务,该服务定期(通常每天一次)通过串行端口与外部设备进行通信。总而言之,服务效果很好,但对于一位客户来说,时不时地打电话给SerialPort.Open()
抛出以下异常:
System.IO.IOException: Insufficient system resources exist to complete the requested service.
at System.IO.Ports.InternalResources.WinIOError(Int32 errorCode, String str)
at System.IO.Ports.SerialStream..ctor(String portName, Int32 baudRate, Parity parity, Int32 dataBits, StopBits stopBits, Int32 readTimeout, Int32 writeTimeout, Handshake handshake, Boolean dtrEnable, Boolean rtsEnable, Boolean discardNull, Byte parityReplace)
at System.IO.Ports.SerialPort.Open()
基于异常,会认为服务器资源不足,但情况似乎并非如此。 CPU 或多或少处于空闲状态,并且有足够的内存和磁盘。
网上有很多提到SerialPort.Open()
抛出其他 IOExceptions 并且我已经实现了Zach Saw 的 SerialPortFixer http://zachsaw.blogspot.se/2010/07/net-serialport-woes.html,但它似乎解决了另一个问题。
这是我正在做的一个例子(大大简化)。该类的几个实例(使用不同的串行端口名称)始终位于内存中,然后每个实例大约每天调用一次 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
}
}
任何帮助,将不胜感激。