title: How to process multiple connections simultaneously with HttpListener?
body: <p>In the application that I build, there is a need for webserver that can serve, simultaneously, multiple clients.<br>
  For that I use the <code>HttpListener</code> object. with its <code>Async</code> methods\events <code>BeginGetContext</code> and <code>EndGetContext</code>.<br>
  In the delegated method, there is a call for the listener to start listening again, and it works.. mostly.</p>
  
  <p>The code provided is a mix of code that i found here and there, and a delay, to simulate a data processing bottleneck.</p>
  
  <p>The problem is, it starts to manage the next connection only AFTER the last one was served.. no use for me.</p>
  
  <pre><code>public class HtServer {
  
  
      public void startServer(){
          HttpListener HL = new HttpListener();
          HL.Prefixes.Add("http://127.0.0.1:800/");
          HL.Start();
          IAsyncResult HLC = HL.BeginGetContext(new AsyncCallback(clientConnection),HL);   
      }
  
      public void clientConnection(IAsyncResult res){
          HttpListener listener = (HttpListener)res.AsyncState;
          HttpListenerContext context = listener.EndGetContext(res);
          HttpListenerRequest request = context.Request;
          // Obtain a response object.
          HttpListenerResponse response = context.Response;
          // Construct a response. 
          // add a delay to simulate data process
          String before_wait = String.Format("{0}", DateTime.Now);
          Thread.Sleep(4000);
          String after_wait = String.Format("{0}", DateTime.Now);
          string responseString = "&lt;HTML&gt;&lt;BODY&gt; BW: " + before_wait + "&lt;br /&gt;AW:" + after_wait + "&lt;/BODY&gt;&lt;/HTML&gt;";
          byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString);
          // Get a response stream and write the response to it.
          response.ContentLength64 = buffer.Length;
          System.IO.Stream output = response.OutputStream;
          // You must close the output stream.
          output.Write(buffer, 0, buffer.Length);
          output.Close();
          listener.BeginGetContext(new AsyncCallback(clientConnection), listener);
      }
  }
  </code></pre>
  
  <h2>edit</h2>
  
  <pre><code>    private static void OnContext(IAsyncResult ar)
      {
          var ctx = _listener.EndGetContext(ar);
          _listener.BeginGetContext(OnContext, null);
  
          Console.WriteLine(DateTime.UtcNow.ToString("HH:mm:ss.fff") + " Handling request");
  
          var buf = Encoding.ASCII.GetBytes("Hello world");
          ctx.Response.ContentType = "text/plain";
  
          // prevent thread from exiting.
          Thread.Sleep(3000);
          // moved these lines here.. to simulate process delay
          ctx.Response.OutputStream.Write(buf, 0, buf.Length);
          ctx.Response.OutputStream.Close();
          Console.WriteLine(DateTime.UtcNow.ToString("HH:mm:ss.fff") + " completed");
      }
  </code></pre>
  
  <p>the output is
  <img src="https://i.stack.imgur.com/zY7mK.png" alt="enter image description here"></p>