Benutzer mit den meisten Antworten
TCP Chat (SynchronizationContext) Warum?

Frage
-
Hallo Ellen,
In Zeile 234 (Sub connect) wird ein SynchronizationContext (sc) erstellt, der in Zeile 359 (Sub DoAccept) mit einem "sc.Post(New SendOrPostCallback(AddressOf OnDatareceived), sb.ToString)" verwendet wird um das "Sub OnDatareceived(ByVal state As Object)" aufzurufen welches ein "RaiseEvent Datareceived(state.ToString)" aufruft.
Ich frage mich, was genau dieser Ablauf bewirkt - was hier synchronisiert wird - und warum in Zeile 359 nicht auch nur ein RaiseEvent genügen würde?
lg heinz
Antworten
-
Hallo Heinz, ja danke Dir..
nach meinem Verständnis geschieht das zeitliche Entkoppeln an der der Stelle sc.Post. Das heist dieser Aufruf ist nicht blockierend, so dass zeitgleich ein neuer BeginAcceptTcpClient gestartet wird. Das ist natürlich für solch ein Chat Programm mit Kanonen auf Spatzen geschossen. Jedoch wenn Du einen kontinuierlichen stream verarbeiten möchtest, must Du an dieser Stelle schon sehr flink sein.
Natürlich könnte man das raiseEvent (Schreiben der Daten an aufrufendes Formular) auch direkt hinter der clientsocket.GetStream().Read(buf, 0, buf.Length) Methode ausführen. Das kannst Du ja einmal testen.
Ich habe schon Überlegungen angestellt, wie ich das Timing exakt messen kann. Das ginge im Prinzip mit der stopwatch Klasse
http://social.msdn.microsoft.com/Search/de-DE?query=stopwatch
Nun ja, ich entwickle seit einem halben Jahr an diesem Code. Ich benutze den zum Datenaustausch zwischen 2 Rechnern im gemeinsamen Subnetz. Das läuft recht gut.
Hoffentlich habe ich Dir helfen können
schöne Grüße Ellen
Nachtrag: Ich habe noch einmal getestet. Der hauptgrund für den sc.Post ist die Daten threadübergreifend in ein Steuerelement des Formulars zu schreiben. Der Versuch Daten direkt auf ein Fromular zu schreiben, führt unweigerlich zu einem thread Fehler
Ich benutze/ I'm using VB2008 & VB2010- Bearbeitet Ellen Ramcke Sonntag, 27. Februar 2011 17:24 Nachtrag
- Als Antwort markiert Heinz999 Montag, 28. Februar 2011 12:52
Alle Antworten
-
hallo Heinz,
sorry, dass ich erst jetzt antworte. Die Woche meinen Vater unter die Erde gebracht.
Die Post-Methode startet eine asynchrone Anforderung zum Übermitteln einer Nachricht
http://msdn.microsoft.com/de-de/library/system.threading.synchronizationcontext.post.aspx
Ein bis zu 8k langer Datenblock wird hier wird hier ebenfalls wieder asynchon weggeschrieben damit der nächste asynchrone TCP Lesevorgang zeitglich gestartet werden kann. Das ist eine timing Sache.
schöne Grüße Ellen
Private sc As SynchronizationContext
' post data
sc.Post(New SendOrPostCallback(AddressOf OnDatareceived), sb.ToString)
' start new read
server.BeginAcceptTcpClient(New AsyncCallback(AddressOf DoAccept), server)
End Sub
'
' now data to calling class
'
Private Sub OnDatareceived(ByVal state As Object)
RaiseEvent Datareceived(state.ToString)
End Sub
Ich benutze/ I'm using VB2008 & VB2010- Bearbeitet Ellen Ramcke Sonntag, 27. Februar 2011 08:29 code
-
Hallo Ellen,
vorweg mein Beileid für deinem Verlust.
Nun, wie ich das verstehe, werden hier Daten (empfangener Text) gekapselt um sie zu einen späteren Zeitpunkt (wann?) an ein Unterprogramm zu übergeben. Das laufende Unterprogramm arbeitet sofort weiter.
Stimmt meine Überlegung ? und wenn ja, warum wird diese Aktion zeitlich entkoppelt?
lg heinz
-
Hallo Heinz, ja danke Dir..
nach meinem Verständnis geschieht das zeitliche Entkoppeln an der der Stelle sc.Post. Das heist dieser Aufruf ist nicht blockierend, so dass zeitgleich ein neuer BeginAcceptTcpClient gestartet wird. Das ist natürlich für solch ein Chat Programm mit Kanonen auf Spatzen geschossen. Jedoch wenn Du einen kontinuierlichen stream verarbeiten möchtest, must Du an dieser Stelle schon sehr flink sein.
Natürlich könnte man das raiseEvent (Schreiben der Daten an aufrufendes Formular) auch direkt hinter der clientsocket.GetStream().Read(buf, 0, buf.Length) Methode ausführen. Das kannst Du ja einmal testen.
Ich habe schon Überlegungen angestellt, wie ich das Timing exakt messen kann. Das ginge im Prinzip mit der stopwatch Klasse
http://social.msdn.microsoft.com/Search/de-DE?query=stopwatch
Nun ja, ich entwickle seit einem halben Jahr an diesem Code. Ich benutze den zum Datenaustausch zwischen 2 Rechnern im gemeinsamen Subnetz. Das läuft recht gut.
Hoffentlich habe ich Dir helfen können
schöne Grüße Ellen
Nachtrag: Ich habe noch einmal getestet. Der hauptgrund für den sc.Post ist die Daten threadübergreifend in ein Steuerelement des Formulars zu schreiben. Der Versuch Daten direkt auf ein Fromular zu schreiben, führt unweigerlich zu einem thread Fehler
Ich benutze/ I'm using VB2008 & VB2010- Bearbeitet Ellen Ramcke Sonntag, 27. Februar 2011 17:24 Nachtrag
- Als Antwort markiert Heinz999 Montag, 28. Februar 2011 12:52