Forum: PC-Programmierung C# - Konzept für asynchrone Kommunikation mit Webserver


von C# Liebhaber (Gast)


Lesenswert?

Hallo!

Ich Programmierer in C# basierend auf dem Model View ViewModel (MVVM) 
eine GUI, die auf Benutzereingaben hin verschiedene UDP Multicastpakete 
abschickt und ggfl. auf eine Antwort warten soll. Momentan erfolgt das 
Zusammenbauen und Abschicken asynchron zum Multicast-Empfang. Beim 
Empfang wird momentan geparst und dann abhängig von der Nachrichtenart 
verschiedene C#-"Events" getriggert.

Nun muss die Anwendung aber, abhängig von vorherigen Antworten, 
verschiedene weitere Requests abschicken. Logisch gesehen also synchron 
eine Nachricht senden und blockieren bis die Antwort (oder ein Timeout) 
kommt und entsprechend weiter machen oder dem Benutzer neue Befehle 
ermöglichen.

Ein Ansatz wäre, mit C#-"AutoResetEvents" in den Event-Delegaten per Set 
die sendende Funktion wieder freizugeben (die WaitOne aufgerufen hatte 
um sich zu synchronisieren). Das/die Pakete wiederum müssten über eine 
eigene Queue übergeben werden, damit nicht mehrere potenzielle Antworten 
verloren gehen.

Seht ihr eine andere Möglichkeit, elegant einen synchronen 
Programmablauf zu erzwingen?

Viele Grüße
Robert

von C# Liebhaber (Gast)


Lesenswert?

Ach so, sinngemäß wäre gewünscht:

Ich kann in der Sende-Funktion mich an das Paket-Empfangen-Event 
abonnieren und jedes eingehende Paket prüfen ob relevant, ansonsten 
Timeout abwarten. So könnten auch mehrere Befehle quasi gleichzeitig 
arbeiten und auf Antwort warten.

Bei einer globalen Queue wäre das Problem, rauszufinden ob alle 
laufenden Funktionen die Pakete in der Queue verarbeitet haben und die 
gelöscht werden können. Mit "Events" funktioniert das besser, da 
automatisch jeder abonnierte Delegat eine Kopie bekommt.

Man könnte natürlich für jede laufende Funktion eine Queue anlegen die 
je eine Kopie bekommen...

von Oliver R. (superberti)


Lesenswert?

Hi,

den Ansatz, mit Events wieder einen synchronen Ablauf zu "simulieren", 
würde ich an Deiner Stelle gleich wieder vergessen.
Viel eleganter geht es z.B. mit dem Task API. Fall Du nicht tausende von 
Befehlen gleichzeitig senden/empfangen musst, würde ich wie folgt 
vorgehen:
1
Task.Run(new Action(() =>
2
{
3
  SendeBefehl();
4
  WarteAufAntwort();
5
  LoeseEventImUIAus();
6
}));

Diese Sequenz kann man auch sehr gut mit dem async/await-pattern 
verbinden,  z.B. beim Click-Handler eines Buttons.
Du delegierst Deine einzelne Aufgabe also jeweils an einen neuen Thread, 
der intern dann synchron abläuft. Wenn der Thread fertig ist, dann kann 
er sich im UI mit Fehler oder Erfolg bemerkbar machen.

Gruß,
Oliver

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.