Is this the right way to use TcpListener in the background?
Your code looks OK, though I think there is some redundant code - e.Result = clientSocket; is never used, since work is never completed...

You might also want to consider a different approach to BackgroundWorker - TcpListener.AcceptTcpClientAsync. Instead of creating a worker thread you can do this:

private Task&lt;TcpClient&gt; listen() {

   return _serverSocket.AcceptTcpClientAsync().ContinueWith(clientSocket =&gt; {
       _launcher.NotifyFormNewTcpClient(clientSocket);
       MessageBox.Show("new TcpClient Connected...");
       return listen();
   });