Ich denke, es ist wichtig zu definieren, was mit dem Wort "Verbindung" gemeint ist.'
Wenn das andere System jedes Mal, wenn eine Transaktion gesendet wird, eine neue Verbindung zu Ihrem TcpListener erstellt, würde dies als mehrere Verbindungen betrachtet werden, und es wäre sinnvoll, einen dedizierten Thread zur Verarbeitung dieser eingehenden Verbindungsanforderungen zu verwenden. Wenn dies der Fall ist, ignorieren Sie alles darüber hinaus und verwenden Sie die Vorschlagslösung von gahooa.
Auf der anderen Seite, wenn das andere System einfach eine Verbindung herstellt und alle Transaktionen über dieselbe Verbindung sendet, dann hat es wirklich keinen Sinn, die Verbindungsanforderung in einem separaten Thread zu verarbeiten (da es nur eine Verbindung gibt). Wenn dies der Fall ist, würde ich vorschlagen, die eingehende Anfrage einmal zu akzeptieren und den Socket asynchron zu lesen (im Gegensatz zum Abfragen des Sockets nach Daten). Jedes Mal, wenn Sie eine vollständige Transaktion erhalten, werfen Sie sie "über die Mauer" zu einem Transaktionsverarbeitungsthread. Wenn die Verarbeitung abgeschlossen ist und die "Antwort" berechnet ist, werfen Sie sie "über die Wand" zu einem Antwort-Thread, der das Ergebnis an das andere System zurücksendet. In diesem Szenario gibt es grundsätzlich vier Threads:
- Hauptthread
- lesen Gewinde
- Verarbeitung Gewinde
- schreiben Gewinde
Der Haupt-Thread erstellt die TcpListener und wartet, bis die Verbindung ist festgelegt. An diesem Punkt wird das asynchrone Lesen gestartet und gewartet, bis das Programm beendet wird (ManualResetEvent.WaitOne()).
Der Lese-Thread ist der asynchrone Thread, der das Lesen vom NetworkStream unterstützt.
Der Verarbeitungsthread empfängt Transaktionen vom Thread "Lesen" und führt alle erforderlichen Verarbeitungen aus.
Der Write-Thread übernimmt alle Antworten, die vom Verarbeitungsthread generiert werden, und schreibt sie in den NetworkStream.
Entsprechend dieser link, müssen Sie das Lesen und Schreiben aus dem gleichen NetworkStream nicht synchronisieren, solange das Lesen und Schreiben in separaten Threads erfolgt. Sie können eine allgemeine Liste oder Warteschlange verwenden, um Daten zwischen den Threads zu verschieben. Ich würde eine für die Read-to-Processing-Daten und eine für die Processing-to-Write-Daten erstellen. Stellen Sie sicher, dass Sie den Zugriff auf sie mithilfe der SyncRoot-Eigenschaft synchronisieren.
Würden Sie sagen, dass viele Verbindungen auf demselben Port vom selben Client aus "mehrere Verbindungen" oder nur eine Verbindung bilden? – alchemical
Es gilt immer noch mehrere Verbindungen. –