ThreadPool を使った非同期サーバ

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");
        }
    }
}