Brechen Sie die Blockierung des AcceptTcpClient-Aufrufs ab

Wie jeder weiß, ist die einfachste Möglichkeit, eingehende TCP-Verbindungen in C # zu akzeptieren, die Schleife über TcpListener.AcceptTcpClient (). Außerdem wird auf diese Weise die Codeausführung blockiert, bis eine Verbindung hergestellt ist. Dies ist äußerst einschränkend für eine grafische Benutzeroberfläche, daher möchte ich Verbindungen in einem separaten Thread oder einer Task abhören.

Mir wurde gesagt, dass Threads mehrere Nachteile haben, aber niemand hat mir erklärt, was das sind. Anstatt also Threads zu verwenden, habe ich Aufgaben verwendet. Das funktioniert gut, aber da die AcceptTcpClient-Methode die Ausführung blockiert, kann ich keinen Weg finden, eine Aufgabe abzubrechen.

Derzeit sieht der Code so aus, aber ich habe keine Ahnung, wie ich die Aufgabe abbrechen möchte, wenn das Programm nicht mehr auf Verbindungen wartet.

Zuerst die in der Aufgabe ausgeführte Funktion:

static void Listen () {
// Create listener object
TcpListener serverSocket = new TcpListener ( serverAddr, serverPort );

// Begin listening for connections
while ( true ) {
    try {
        serverSocket.Start ();
    } catch ( SocketException ) {
        MessageBox.Show ( "Another server is currently listening at port " + serverPort );
    }

    // Block and wait for incoming connection
    if ( serverSocket.Pending() ) {
        TcpClient serverClient = serverSocket.AcceptTcpClient ();
        // Retrieve data from network stream
        NetworkStream serverStream = serverClient.GetStream ();
        serverStream.Read ( data, 0, data.Length );
        string serverMsg = ascii.GetString ( data );
        MessageBox.Show ( "Message recieved: " + serverMsg );

        // Close stream and TcpClient connection
        serverClient.Close ();
        serverStream.Close ();

        // Empty buffer
        data = new Byte[256];
        serverMsg = null;
    }
}

Zweitens die Funktionen zum Starten und Stoppen des Abhördienstes:

private void btnListen_Click (object sender, EventArgs e) {
    btnListen.Enabled = false;
    btnStop.Enabled = true;
    Task listenTask = new Task ( Listen );
    listenTask.Start();
}

private void btnStop_Click ( object sender, EventArgs e ) {
    btnListen.Enabled = true;
    btnStop.Enabled = false;
    //listenTask.Abort();
}

Ich brauche nur etwas, um den listenTask.Abort () -Aufruf zu ersetzen (was ich auskommentiert habe, weil die Methode nicht existiert)

Antworten auf die Frage(5)

Ihre Antwort auf die Frage