Обработка приостановки COM, пока Windows приостанавливается
Я пишу приложение службы Windows в.NET v4.6.1, которое связывается с беспроводным сканером штрих-кода через VirtualCOM. После изменения кода, основанного на событиях, для этого. Если вам необходимо использовать.NET System.IO.Ports.SerialPort, у моей службы возникнут проблемы с обработкой приостановки com-порта при блокировке / приостановке Windows. Я пытаюсь установить соединение, и если COM-порт открыт, но Windows закрывается, и COM-порт приостановлен. Я также отключаю управление питанием USB от Windows в диспетчере устройств.
public void RunScanner()
{
if (_serialPort.IsOpen)
{
_serialPort.Close();
}
try
{
_serialPort.Open();
StartReadingData();
}
catch (System.Exception e)
{
_serialPort.Close();
LoggingHelper.LogEvents(e.StackTrace, EventLogEntryType.Error, 9999);
}
}
private void StartReadingData()
{
byte[] buffer = new byte[128];
Action kickOffRead = null;
kickOffRead = delegate {
_serialPort.BaseStream.BeginRead(buffer, 0, buffer.Length, delegate (IAsyncResult ar)
{
ReadDataFromComPort(ar, buffer);
if (!_serialPort.IsOpen)
{
ReopenPort();
}
kickOffRead();
}, null);
};
kickOffRead();
}
private void ReadDataFromComPort(IAsyncResult ar, byte[] buffer)
{
try
{
if (_serialPort.IsOpen)
{
int actualLength = _serialPort.BaseStream.EndRead(ar);
byte[] received = new byte[actualLength];
Buffer.BlockCopy(buffer, 0, received, 0, actualLength);
_splitter.OnIncomingBinaryBlock(received);
}
}
catch (IOException exc)
{
LoggingHelper.LogEvents(exc.Message, EventLogEntryType.Error, 9696);
}
}
Это код, ответственный за чтение из COM. После блокировки у меня есть System.InvalidOperationException, “The BaseStream is only available when the port is open
, Кто-нибудь может мне помочь с этой проблемой?
РЕДАКТИРОВАТЬ
ReopenPort
код метода:
private void ReopenPort()
{
if (_serialPort.IsOpen)
{
return;
}
else
{
try
{
_serialPort.Open();
}
catch (System.Exception e)
{
LoggingHelper.LogEvents(e.StackTrace, EventLogEntryType.Error, 9999);
}
}
}