title: Cancel blocking AcceptTcpClient call
body: <p>As everyone may already know, the simplest way to accept incoming TCP connections in C# is by looping over TcpListener.AcceptTcpClient(). Additionally this way will block code execution until a connection is obtained. This is extremely limiting to a GUI, so I want to listen for connections in either a seperate thread or task.</p>
  
  <p>I have been told, that threads have several disadvantages, however nobody explained me what these are. So instead of using threads, I used tasks. This works great, however since the AcceptTcpClient method is blocking execution, I can't find any way of handling a task cancellation.</p>
  
  <p>Currently the code looks like this, but I have no idea how I would want to cancel the task when I want the program to stop listening for connections.</p>
  
  <p>First off the function executed in the task:</p>
  
  <pre><code>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;
      }
  }
  </code></pre>
  
  <p>Second, the functions starting and stopping the listening service:</p>
  
  <pre><code>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();
  }
  </code></pre>
  
  <p>I just need something to replace the listenTask.Abort() call (Which I commented out because the method doesn't exist)</p>