シリアル磁気ストライプ リーダーおよびリレー ボード (アクセス制御システム) と通信するための Windows サービスを作成しています。
別のプログラムが自分のサービスと同じシリアル ポートを開いてプロセスを「中断」した後、コードが動作しなくなる (IOExceptions が発生する) 問題が発生します。
コードの一部は次のとおりです。
public partial class Service : ServiceBase
{
Thread threadDoorOpener;
public Service()
{
threadDoorOpener = new Thread(DoorOpener);
}
public void DoorOpener()
{
while (true)
{
SerialPort serialPort = new SerialPort();
Thread.Sleep(1000);
string[] ports = SerialPort.GetPortNames();
serialPort.PortName = "COM1";
serialPort.BaudRate = 9600;
serialPort.DataBits = 8;
serialPort.StopBits = StopBits.One;
serialPort.Parity = Parity.None;
if (serialPort.IsOpen) serialPort.Close();
serialPort.Open();
serialPort.DtrEnable = true;
Thread.Sleep(1000);
serialPort.Close();
}
}
public void DoStart()
{
threadDoorOpener.Start();
}
public void DoStop()
{
threadDoorOpener.Abort();
}
protected override void OnStart(string[] args)
{
DoStart();
}
protected override void OnStop()
{
DoStop();
}
}
私のサンプル プログラムは正常にワーク スレッドを開始し、DTR の開閉と上昇により、Mag-stripe リーダーが起動 (1 秒待機)、シャットダウン (1 秒待機) などします。
HyperTerminal を起動して同じ COM ポートに接続すると、HyperTerminal はポートが現在使用中であることを通知します。ハイパーターミナルで ENTER を繰り返し押して、ポートを再度開いてみると、数回再試行すると成功します。
これにより、作業スレッドで IOExceptions が発生する効果があり、これは予想どおりです。ただし、HyperTerminal を閉じても、ワークスレッドで同じ IOException が発生します。唯一の解決策は、実際にコンピューターを再起動することです。
他のプログラム (ポート アクセスに .NET ライブラリを使用していないプログラム) は、この時点では正常に動作しているようです。
これを引き起こしている原因についてのアイデアはありますか?