.NET Core: TcpClient.GetStream stürzt ab, wenn Async verwendet wird

9

Ich habe versucht, mit .NET Core zu spielen und möchte eine Verbindung zu einem lokalen TCP-Server herstellen. Keine Probleme, wenn ich es synchron mache (siehe erste Connect -Methode). Wenn ich versuche, es mit async / await (siehe zweite ConnectAsync Methode) zu machen, wird es verrückt und fast unzugänglich. Ich werde nicht verklagen, wenn ich TcpClient richtig verwende, da es im Web noch nicht so viele Beispiele gibt. Die genauen Probleme beginnen nach dem Aufruf von TcpClient.GetStream . Ich habe versucht, dies zu debuggen mit% che_de% deaktiviert und JustMyCode Checkbox in Visual Studio Code - aber es springt einfach nicht in All exceptions .

Beobachtungen in TcpClient.GetStream mode:

  • manchmal stürzt es in async direkt ab
  • manchmal stürzt es ab, nachdem die aufrufende Funktion zurückkehrt (ich sah, dass das letzte TcpClient.GetStream manchmal in der Konsole erscheint)
  • Das Programm stoppt sofort, der Debugger wird heruntergefahren (keine Ausnahme ausgelöst)
  • Rückkehrcode ist immer Null ( Console.WriteLine )

Mein System / Projekt-Setup:

  • Windows 10 64bit (Bildung)
  • .NET Core 1.0.0
  • Konsolenanwendung
  • lokaler TCP-Server, daher keine Verbindungsprobleme
  • Visual Studio Code (sollte nicht wichtig sein)

Code:

%Vor%     
The Wavelength 26.08.2016, 09:24
quelle

1 Antwort

5

Das von Ihnen beschriebene Problem weist auf den Hauptthread Ihrer Anwendung hin. Um dieses Problem richtig zu identifizieren, muss man sich die gesamten Anwendungen und die Threads ansehen, die zu einem bestimmten Zeitpunkt aktiv sind.

Aber zum Beispiel wird eine einfache Konsolenanwendung beendet, sobald der Hauptteil beendet ist. Je nachdem, wie Sie Ihre Funktion ConnectAsync aufrufen, fehlt Ihnen möglicherweise etwas, das dafür sorgt, dass die Hauptschleife nicht beendet wird. Stellen Sie sicher, dass Ihr Haupteinstiegspunkt keine Funktion async ist, da diese beendet wird, sobald sie ihr erstes await erreicht.

Der Hauptunterschied zwischen Ihren beiden Methoden besteht darin, dass die ConnectAsync -Methode die Threads sehr wahrscheinlich wechselt und den zweiten Teil in einem anderen Thread ausführt und nicht den Thread blockiert, in dem sie aufgerufen wurde, wie die Funktion Connect .

Es erklärt genau das Verhalten, das Sie beschreiben. Einige Zeit nach dem

%Vor%

Zeile wird ausgeführt, die Hauptschleife Ihrer Anwendung wird beendet und bewirkt, dass die gesamte .NET-VM heruntergefahren wird.

    
Nitram 26.08.2016, 18:33
quelle