ThreadPool を使ってぶんまわすだけ。
Stop では Loop の終了を待ちます。
using System; using System.Net.Sockets; using System.Net; using System.Threading; using System.Diagnostics; namespace Samples { class ThreadPoolListener { Socket listener; bool active; ManualResetEvent waitHandle; public ThreadPoolListener() { Debug.WriteLine("Enter ThreadServer::.ctor"); listener = null; active = false; waitHandle = null; Debug.WriteLine("Exit ThreadServer::.ctor"); } public void Start() { if (listener != null) return; Debug.WriteLine("Enter ThreadServer::Start"); listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); listener.Bind(new IPEndPoint(IPAddress.Loopback, 8081)); listener.Listen(10); active = true; ThreadPool.QueueUserWorkItem(delegate { Debug.WriteLine("Enter ThreadServer::Loop"); while (active) { try { Socket client = listener.Accept(); ThreadPool.QueueUserWorkItem(delegate { // ここでクライアントとの通信 // Connection conn = new Connection(client); // while (conn.Connected) // { // Request request = conn.ReadRequest(); // Response response = CreateResponse(request); // conn.WriteResponse(response); // } // conn.Dispose(); client.Close(); // とりあえず }); } catch (Exception e) { Debug.WriteLine("Exception ThreadServer::Loop " + e.Message); } } waitHandle.Set(); Debug.WriteLine("Exit ThreadServer::Loop"); }); Debug.WriteLine("Exit ThreadServer::Start"); } public void Stop() { if (listener == null) return; Debug.WriteLine("Enter ThreadServer::Stop"); using (waitHandle = new ManualResetEvent(false)) { active = false; listener.Close(); waitHandle.WaitOne(); // 待つ } waitHandle = null; listener = null; Debug.WriteLine("Exit ThreadServer::Stop"); } } }