Обновление графического интерфейса C # и асинхронная связь через последовательный порт
Я пытаюсь создать приложение, которое связывается с оборудованием через последовательный порт и сообщает о результатах в графический интерфейс.
В настоящее время перемещение по GUI осуществляется KeyEvents, которые запускают рисование следующей «страницы» GUI. Однако на одном шаге (после нажатия клавиши) мне нужно нарисовать новую страницу и отправить несколько команд через последовательный порт.
Отправка команды осуществляется через:
port.Write(data, 0, data.Length);
Затем я жду ответа, ожидая срабатывания DataReceivedHandler - он просто показывает, что данные ожидают, а данные обрабатываются другим способом.
Сначала я просто поместил команду отправки и получения в функцию рисования страницы после «рисования частей», однако она застряла - данные передавались, но страница не рисовалась - она была заморожена.
Затем я сделал асинхронный метод:
private async void SendData()
{
await Task.Run(() => serialClass.SendAndReceive(command));
// process reply etc.
}
Который используется так:
public void LoadPage()
{
image = Image.FromFile(path);
//do some stuff on image using Graphics, adding texts etc.
picturebox1.Image = image;
SendData();
}
Он работает нормально, однако мне нужно «перезагрузить» страницу (чтобы снова вызвать LoadPage). Если я сделаю это внутри асинхронного метода, как это:
private async void SendData()
{
await Task.Run(() => serialClass.SendAndReceive(command));
// process reply etc.
LoadPage();
}
Тогда, очевидно, изображение не будет обновлено, хотя данные будут отправлены через последовательный порт. Можно ли как-то проверить, была ли завершена асинхронная функция, и вызвать событие, при котором я мог бы перезагрузить страницу?
До сих пор я пытался использовать BackGroundWorker Work Complete и изменение свойства. Данные были отправлены снова, но изображение не было перезагружено. Есть идеи, как мне этого добиться?
Заранее спасибо за помощь, С наилучшими пожеланиями