Düzenli olarak (genellikle günde bir kez) bir seri bağlantı noktası üzerinden harici bir aygıtla iletişim kurduğum bir .NET 4 Windows hizmetim var. Tüm tüm hizmet harika çalışır, ancak her şimdi ve sonra bir müşteri için, SerialPort.Open()
bir çağrı şu istisna atar: istisna dayanarakSerialPort.Open(), IOException'ı atar - İstenen hizmeti tamamlamak için yeterli sistem kaynağı yok
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()
, sunucu kaynakları azalıyor olduğunu düşünürdüm ediyorum ama bu durum böyle görünmüyor. CPU az ya da çok boşta ve bol miktarda bellek ve disk var.
SerialPort.Open()
'un diğer IOExceptions'ı atma konusunda birçok söz var ve ben Zach Saw's SerialPortFixer'u uyguladık, ancak farklı bir sorunu giderdiği anlaşılıyor.
Yaptığım şeyin bir örneği (büyük ölçüde basitleştirilmiş). Bu sınıfın birkaç örneği (farklı seri bağlantı noktası adlarını kullanarak) her zaman belleğindedir ve sonra her bir örnek için yaklaşık olarak günde bir kez Run() yöntemi çağrılır.
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
}
}
Herhangi bir yardım için teşekkür ederiz.
Bu hata, alt ağın bir TCP/IP adresi ekleyin cihaz sürücüsü gelir. Müşteriye şimdi sahip olduğu USB emülatörünü atıp farklı bir üreticiden bir tane daha almasını söyleyin. –
Aslında, bunlardan birini kullanıyorlar (http://www.moxa.com/product/nport_5110.htm) ve bunların en iyisi olması gerekiyor. –