Как правильно осуществить алгоритм вывода логов в listbox и datagrid внутри асинхронного метода класса C#

Рейтинг: 0Ответов: 0Опубликовано: 07.03.2023

задача которая поставила меня в тупик. Есть класс, в котором содержится два основных метода, поля здесь не описывал. Первый метод читает прошивку под микроконтроллер и сортируя забрасывает в буфер. Второй достает эти данные из буфера, формирует блок данных и отправляет его в порт. По действию кнопки на форме, методы вызываются последовательно один за другим. Внутри второго метода рассчитывается процент чтения буфера и записывает его в свойство 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;
                        }
                        
                    }
                }
            }```

Ответы

Ответов пока нет.