![]() |
Resynchronisation eines asynchronen Sockets ^^
Moin,
nachdem mein asynchroner Socket jetzt einwandfrie läuft, stehe ich vor dem Problem, dass manches doch besser synchron ablaufen würde. Konkret gibt es zwei Szenarien, die immer parallel ablaufen: 1) Es treffen Nachrichten unvorhersehbar ein, die abgearbeitet werden sollen (der bisher asynchrone Part) 1a) Es werden Nachrichten asynchron gesendet, Ergebnis ist erstmal irrelevant 2) Es wird eine Nachricht gesendet, aber der Methodenaufurf soll blockieren, bis eine entsprechende Antwort empfangen wurde, und diese Antwort soll zurückgegeben werden. Nicht auszuschließen ist dabei natürlich, dass vor der gewünschten Antwort weitere der o.g. nicht vorhersehbaren Nachrichten eintreffen. Zu diesem Zweck hatte ich mir folgendes gedacht:
Code:
Wobei Send das bisher verwendete asynchrone Senden ist und das asynchrone ReceiveCallback synchronizedSend bei Empfang eines adäquaten Objekts signalisiert.
public object SyncSend(string command, object payload, string syncCommand = null)
{ synchronizedSend.Reset(); targetCommand = syncCommand == null ? command : syncCommand; Send(command, payload); synchronizedSend.WaitOne(); return synchronizedObjects.Dequeue(); } Problem an der Sache: dieses ManualResetEvent blockiert allem Anschein nach auch dieses asynchrone Receive, was quasi in einer endlosschleife läuft (ReceiveCallback ruft wieder BeginReceive auf). Und ich sehe absolut keinen Grund, wieso dem so sein sollte. Das hieße ja, dass beide Methoden im selben Thread liefen, und das ergibt irgendwie keinen Sinn. Wer kann mir helfen? |
AW: Resynchronisation eines asynchronen Sockets ^^
:cyclops:
|
AW: Resynchronisation eines asynchronen Sockets ^^
Erwartest du für jede Message eine Antwort oder Quittierung?
Oder sind deine Messages im Protokoll irgendwie durchnummeriert? Edit: Ok, du hast ja geschrieben dass unvorhersehbare Nachrichten eintreffen können. Das bedeutet, dass im Protokoll auf OSI-Ebene 7 die Messages irgendwie gekennzeichnet werden müssen. Das Einfachste wäre eine fortlaufende ID zu vergeben. |
AW: Resynchronisation eines asynchronen Sockets ^^
Hm, vielleicht sollte ich doch meine Fragepostings etwas kürzer&pregnanter fassen :stupid:
Ich habe kein Netzwerkproblem - es handelt sich vielmehr um ein generelles .Net-Multithreading-Problem, zumindest gehe ich davon im Moment aus. Ein ManualResetEvent blockiert allem Anschein nach einen asynchronen Socket-Callback, und das dürfte meines Verständnises nach einfach nicht passieren. |
AW: Resynchronisation eines asynchronen Sockets ^^
Push ^^
(Ich würde ja auch gerne den Titel ändern, aber irgendwie sind jegliche Bearbeitungsfunktionen verschwunden?!?! Ach ja, da war ja mal sowas mit 24h :roll:) |
AW: Resynchronisation eines asynchronen Sockets ^^
Zitat:
|
AW: Resynchronisation eines asynchronen Sockets ^^
Was heißt das nun genau? Es kommt zu einem Deadlock, bevor der BeginReceive-Callback überhaupt aufgerufen wird? Das dürfte wirklich nicht passieren, da die in einem neuen Threadpool-Thread ausgeführt werden. Sollte es trotzdem einer sein - nicht verzagen, SOS fragen :)
![]() Warum du den Programmteil aber unbedingt synchron ausführen lassen musst und nicht mit einer Art von Continuation arbeiten kannst (Rx würde sich hier wahrscheinlich anbieten :) ), habe ich noch nicht verstanden. |
AW: Resynchronisation eines asynchronen Sockets ^^
Zitat:
Zitat:
|
AW: Resynchronisation eines asynchronen Sockets ^^
Zitat:
Code:
wir mit einer (asynchronen) Continuation in etwa zu
var a = Foo();
var b = Receive(); a.Process(b);
Code:
Damit ist die Transformation doch wirklich beherrschbar ;) . Und alle state-Parameter sind dadurch auch überflüssig geworden.
var a = Foo();
BeginReceive(b => a.Process(b)); |
AW: Resynchronisation eines asynchronen Sockets ^^
Öh ja. Muss ich mir erstmal genauer angucken - hab ich noch keine Ahnung davon :stupid:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz