none
TCP Chat (SynchronizationContext) Warum? RRS feed

  • 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

    Dienstag, 22. Februar 2011 09:58

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
    Sonntag, 27. Februar 2011 15:37

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
    Sonntag, 27. Februar 2011 08:23
  • 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

    Sonntag, 27. Februar 2011 11:26
  • 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
    Sonntag, 27. Februar 2011 15:37
  • Hallo Ellen,

    danke, der Nebel lichtet sich,

    lg heinz

    Montag, 28. Februar 2011 12:54