Ho un servizio .NET 4 Windows che ho scritto che periodicamente (solitamente una volta al giorno) comunica con un dispositivo esterno su una porta seriale. Nel complesso il servizio di grandi opere, ma per un cliente, ogni tanto, una chiamata a SerialPort.Open()
tiri la seguente eccezione:SerialPort.Open() genera IOException - Esistono risorse di sistema insufficienti per completare il servizio richiesto
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()
Sulla base di eccezione, sarebbe portati a pensare che il server sta esaurendo le risorse , ma non sembra essere il caso. La CPU è più o meno inattiva e c'è un sacco di memoria e disco.
Ci sono molte menzioni online di SerialPort.Open()
che lanciano altre IOException e ho implementato Zach Saw's SerialPortFixer, ma sembra che risolva un altro problema.
Ecco un esempio di ciò che sto facendo (notevolmente semplificato). Un paio di istanze di questa classe (usando diversi nomi di porta seriale) sono sempre in memoria e quindi il metodo Run() viene chiamato approssimativamente una volta al giorno per ogni istanza.
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
}
}
Qualsiasi aiuto sarebbe apprezzato.
Questo errore deriva dal driver di periferica. Dì al cliente di buttare via l'emulatore USB che ha ora e prenderne un altro da un altro produttore. –
Infatti, stanno utilizzando uno di [questi] (http://www.moxa.com/product/nport_5110.htm) e dovrebbero essere i migliori. –