定期的に (通常は 1 日 1 回) シリアル ポート経由で外部デバイスと通信する .NET 4 Windows サービスを作成しました。全体として、このサービスはうまく機能しますが、1 人の顧客に対して、時々 を呼び出すとSerialPort.Open()
、次の例外がスローされます。
System.IO.IOException: 要求されたサービスを完了するためのシステム リソースが不足しています。 System.IO.Ports.InternalResources.WinIOError (Int32 errorCode、文字列 str) で System.IO.Ports.SerialStream..ctor (文字列 portName、Int32 baudRate、パリティ パリティ、Int32 dataBits、StopBits stopBits、Int32 readTimeout、Int32 writeTimeout、ハンドシェイク ハンドシェイク、ブール値の dtrEnable、ブール値の rtsEnable、ブール値の discardNull、Byte parityReplace) で System.IO.Ports.SerialPort.Open() で
例外に基づいて、サーバーのリソースが不足していると考えるでしょうが、そうではないようです。CPU は多かれ少なかれアイドル状態であり、十分なメモリとディスクがあります。
SerialPort.Open()
他の IOExceptions をスローすることについてオンラインで多くの言及があり、Zach Saw の SerialPortFixerを実装しましたが、別の問題が修正されたようです。
これが私がやっていることの例です(非常に単純化されています)。このクラスのいくつかのインスタンス (異なるシリアル ポート名を使用) が常にメモリ内にあり、Run() メソッドが各インスタンスに対してほぼ 1 日に 1 回呼び出されます。
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
}
}
どんな助けでも大歓迎です。