Note that there are some explanatory texts on larger screens.

plurals
  1. POCancel blocking AcceptTcpClient call
    primarykey
    data
    text
    <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>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload