Frage

, die auf der Silverlight-Laufzeit hat nur asynchrone Methoden

Ich war mit Silverlight TCP-Kommunikation Hantieren und ich war gezwungen, die System.Net.Sockets.Socket Klasse zu verwenden.

Ich habe mich gefragt, was passiert, wenn zwei Threads SendAsync auf einem Sockel Instanz in sehr kurzen Zeit eine von dem anderen nennen?

Meine einzige Sorge ist, nicht miteinander vermischt Bytes haben, über den TCP-Kanal gehen.

Als eine asynchrone Methode Ich nehme an die Nachricht in eine Warteschlange gestellt wird, aus dem ein einzelner Thread entnimmt, so dass keine solche Dinge passieren wird (Vermischungs Inhalt der Nachricht auf dem Draht).

Aber ich bin nicht sicher, und die MSDN sagt nicht alles, was in der Beschreibung des Verfahrens. Ist jemand sicher das?

EDIT1: Nein, auf einem Objekt Sperren vor dem Aufruf SendAsync wie:

lock(this._syncObj)
{
    this._socket.SendAsync(arguments);
}

wird nicht helfen, da dies die Anforderungen serialisiert Daten senden die Daten nicht gesendet tatsächlich.

War es hilfreich?

Lösung

Um die SendAsync müssen Sie zuerst anrufen haben ConnectAsync mit einer Instanz von SocketAsyncEventArgs genannt. Es ist die Instanz von SocketAsyncEventArgs, die die Verbindung zwischen dem Client und dem Server darstellt. Der Aufruf SendAsync mit der gleichen Instanz von SocketAsyncEventArgs, die für einen hervorragenden Ruf gerade verwendet hat SendAsync zu einer Ausnahme führt.

Es ist möglich, mehrere ausstehende Anrufe SendAsync des gleichen Socket Objekt, sondern nur mit verschiedenen Instanzen von SocketAsyncEventArgs zu machen. Zum Beispiel (in einem Paralleluniversum, wo diese necessay sein könnte) Sie mehr HTTP-Posts zu dem gleichen Server zur gleichen Zeit werden machen können, aber auf verschiedene Verbindungen. Dies ist durchaus akzeptabel und normale weder Client noch Server verwirren darüber, welches Paket ist das.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top