Требуется непрерывно считывать данные с аппаратного обеспечения и отправлять данные на
верхние слои для дальнейшей обработки.
В настоящее время я использую синхронный механизм. т.е.
Запрос -> Ожидание -> Читать ---> Отправить на обработку.
do
{
int ix = iy;
iy = 0;
if(ix<1)
{
while (((ix = ReadSst(ref sBuffer)) < 1) && bProcessNotEnded == true)
{
if (ix < 0) // BT Error
{
eErr = CError.BUFF_KILL; //Throw error and exit
break;
}
Thread.Sleep(2);
iTimeOut += 2;
if (iTimeOut > TIMEOUT_2000)
{
eErr = CError.TIMEOUT_ERR;
objLogger.WriteLine("HW TIMED OUT");
break;
}
}
}
iBytesRead = ix;
if (iBytesRead <= 0)
{
eErr = CError.READ_ERR;
objLogger.WriteLine("READ ERROR");
break;
}
sReadMsg = sReadMsg + sBuffer;
if(sReadMsg.Length >0)
iEndPos = sReadMsg.IndexOf('\n',1);
else
iEndPos = -1;
if (sReadMsg.Length > 2)
{
if ((iEndPos == 0 && sReadMsg[0] == '\n') || (iEndPos > 0 && sReadMsg[sReadMsg.Length - 1] == '\n' && sReadMsg[sReadMsg.Length - 2] == '\r')) //finished
{
Thread.Sleep(50); // wait a short time to be sure there that there is no further input
if (sReadMsg.Length >= 3 && sReadMsg[sReadMsg.Length - 3] == 'a')
continue;
iy = ReadSst(ref sBuffer);
if (iy == 0)
{
bProcessNotEnded = false;
objLogger.WriteLine("bProcessNotEnded is made false, End of frame detected");
break;
}
else if (iy < 0)
{
eErr = CError.BUFF_KILL; // error
break;
}
}
}
} while (bProcessNotEnded);
Метод ReadSst - это вызов оборудования для запроса данных.
Как видно из кода, существующая логика i зацикливается и читается, пока флаг bProcessNotEnded не станет истинным. Как только конец кадра обнаружен в строковом буфере, который я получаю, я устанавливаю флаг в false и цикл останавливается (так же, как чтение с аппаратного обеспечения)
Теперь, когда мне нужно добиться некоторого параллелизма в моем коде для повышения производительности, я хочу научиться улучшать его так, как чтение выполняется асинхронно.
Любой, кто поможет мне улучшить этот существующий дизайн.
Заранее спасибо