Ich versuche, eine Anwendung zu erstellen, die mit der Hardware über die serielle Schnittstelle kommuniziert und die Ergebnisse an die GUI meldet.C# GUI aktualisieren und asynchrone serielle Schnittstelle Kommunikation
Momentan läuft die GUI durch KeyEvents, die das Zeichnen der nächsten "Seite" der GUI auslösen. Aber in einem Schritt (nachdem die Taste gedrückt wurde) muss ich eine neue Seite zeichnen und einige Befehle über die serielle Schnittstelle senden.
Der Befehl wird bei Versand via getan:
port.Write(data, 0, data.Length);
Ich warte auf die Antwort dann für DataReceivedHandler warten auslösen - es Stifte nur darauf hin, dass es Daten gibt, warten und Daten in einem anderen Verfahren verarbeitet werden.
Zuerst habe ich einfach senden & empfangenden Befehl in der Funktion Zeichnen der Seite nach der "Teile ziehen" aber es machte es stecken - die Daten wurden übertragen, aber die Seite wurde nicht gezeichnet - es wurde eingefroren.
Dann machte ich eine Asynchron-Methode:
private async void SendData()
{
await Task.Run(() => serialClass.SendAndReceive(command));
// process reply etc.
}
, die wie die verwendet wird:
public void LoadPage()
{
image = Image.FromFile(path);
//do some stuff on image using Graphics, adding texts etc.
picturebox1.Image = image;
SendData();
}
Es funktioniert gut, aber ich muss "reload" die Seite (wieder LoadPage nennen) . Wenn ich es in der Asynchron-Methode wie folgt tun:
private async void SendData()
{
await Task.Run(() => serialClass.SendAndReceive(command));
// process reply etc.
LoadPage();
}
Dann offensichtlich wird das Bild nicht aktualisiert werden, wenn die Daten über die serielle Schnittstelle gesendet. Ist es möglich, irgendwie zu überprüfen, ob die Async-Funktion beendet ist und ein Ereignis auszulösen, bei dem ich die Seite neu laden könnte?
Bisher habe ich versucht, die BackGroundWorker Work Complete und Property Change zu verwenden. Die Daten wurden erneut gesendet, aber das Bild wurde nicht erneut geladen. Irgendeine Idee, wie ich das erreichen kann?
Vielen Dank im Voraus für die Hilfe, Mit freundlichen Grüßen
Stopp mit 'async void', [es nur für Event-Handler verwendet werden soll] (https://msdn.microsoft.com/en-us/magazine/jj991977.aspx). –