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
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.