Cancelar el bloqueo de llamada AcceptTcpClient

Como todos ya saben, la forma más sencilla de aceptar conexiones TCP entrantes en C # es hacer un bucle sobre TcpListener.AcceptTcpClient (). Adicionalmente, de esta manera bloqueará la ejecución del código hasta que se obtenga una conexión. Esto es extremadamente limitante para una GUI, por lo que quiero escuchar las conexiones en un hilo o tarea por separado.

Me han dicho que los hilos tienen varias desventajas, sin embargo nadie me explicó cuáles son. Así que en lugar de usar hilos, usé tareas. Esto funciona muy bien, sin embargo, dado que el método AcceptTcpClient está bloqueando la ejecución, no puedo encontrar ninguna forma de manejar la cancelación de una tarea.

Actualmente, el código tiene este aspecto, pero no tengo idea de cómo desearía cancelar la tarea cuando deseo que el programa deje de escuchar las conexiones.

Primero la función ejecutada en la tarea:

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;
    }
}

En segundo lugar, las funciones que inician y detienen el servicio de escucha:

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();
}

Solo necesito algo para reemplazar la llamada listenTask.Abort () (que comenté porque el método no existe)

Respuestas a la pregunta(5)

Su respuesta a la pregunta