Как правильно осуществить алгоритм вывода логов в listbox и datagrid внутри асинхронного метода класса C#
задача которая поставила меня в тупик. Есть класс, в котором содержится два основных метода, поля здесь не описывал. Первый метод читает прошивку под микроконтроллер и сортируя забрасывает в буфер. Второй достает эти данные из буфера, формирует блок данных и отправляет его в порт. По действию кнопки на форме, методы вызываются последовательно один за другим. Внутри второго метода рассчитывается процент чтения буфера и записывает его в свойство PercentReport
в котором доступ только чтение.
После каждой отправки блока, выставляем флаг exit
и падаем в бесконечный цикл дожидаясь ответа от устройства через порт(чтение порта в отдельном потоке), ответ сбрасывает флаг и отправка блока и цикл повторяется. Так вот после ожидающего бесконечного цикла хочу вывести логи SubStatus в listbox, и проценты выполнения PercentReport в dataGrid.
Как это можно осуществить правильно? Думал сразу закинуть в эти методы ссылки на listBox и DG но скорее всего не прокатит, так как это другой поток и будет ругаться. Или можно ли перед вызовом второй функции создать другой поток, в котором тоже в цикле проверять PercentReport, если отличный. выводить в DG и также логи в listBox. Или так вообще никто не делает? Сильно пожалуйста не пинайте. в основном работаю с микроконтроллерами на чистом СИ и C++. С потоками большого опыта не имел(. Смотрел ранее урок по C# где под вывод логов использовали наверное статический класс. но может ошибаюсь(
{ }
/*
* size - размер передаваемого блока данных
*/
public async Task /* void*/ IntelHexSendBlock(byte size, /*ref*/ SerialPort port)//читаем данные из массива TIntelHexData
{
SendEraseSectors(ref port);//подготавливаем память зачищая сектора
if (Reports == SubStatus.FirmFatalErase || Reports == SubStatus.FirmExceededAddressError) { Reports = 0; return; } //если при стирании случилась фатальная ошибка, переходим к прошивке следующего блока
while (sendCNTR < counter)
{
if (Reports == SubStatus.FatalError) { Reports = 0; return; }
RxTxForms.Send_Data_Protocol((byte)Protocol_Id.FirmwareEndBlock, ref tmp, port);//конец блока, отправляем блоком
PercentReport = (byte)((sendCNTR * 100) / counter);//calculate percets
//.........................................................waiting.......................................................................
bool exit = true;//может это костыльно но другого способа не придумал
while (exit)
{
await Task.Delay(TimeSpan.FromMilliseconds(1));
//Thread.Sleep(TimeSpan.FromMilliseconds(1));
switch (Reports)
{
case SubStatus.FirmSendNextBlockData:
exit=false;
Reports = 0;
break;
case SubStatus.FirmSendPrevBlockData:
sendCNTR = PrevSendCNTR;
exit = false;
Reports = 0;
break;
/* case SubStatus.FirmRepeatSendAll:
sendCNTR = 0;
exit = false;
Reports = 0;
break;*/
case SubStatus.FatalError:
exit = false;
break;
}
}
}
}```