Anuluj blokowanie połączenia AcceptTcpClient

Jak wszyscy już wiedzą, najprostszym sposobem akceptowania przychodzących połączeń TCP w C # jest zapętlenie TcpListener.AcceptTcpClient (). Dodatkowo ten sposób zablokuje wykonanie kodu, aż do uzyskania połączenia. To jest bardzo ograniczające dla GUI, więc chcę słuchać połączeń w osobnym wątku lub zadaniu.

Powiedziano mi, że wątki mają kilka wad, jednak nikt nie wyjaśnił mi, czym one są. Zamiast używać wątków, korzystałem z zadań. Działa to doskonale, jednak ponieważ metoda AcceptTcpClient blokuje wykonanie, nie mogę znaleźć żadnego sposobu na anulowanie zadania.

Obecnie kod wygląda tak, ale nie mam pojęcia, jak chciałbym anulować zadanie, gdy chcę, aby program przestał nasłuchiwać połączeń.

Najpierw funkcja wykonywana w zadaniu:

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

Po drugie, funkcje uruchamiające i zatrzymujące usługę słuchania:

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

Potrzebuję czegoś, co zastąpi wywołanie listenTask.Abort () (które skomentowałem, ponieważ metoda nie istnieje)

questionAnswers(5)

yourAnswerToTheQuestion