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:
async
direkt ab TcpClient.GetStream
manchmal in der Konsole erscheint) Console.WriteLine
) Mein System / Projekt-Setup:
Code:
%Vor%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.
Tags und Links c# sockets windows async-await .net-core