0

着信リクエストごとに新しいスレッドを開きたいとき。これはそれを行うための良い方法ですか?受け入れられたすべてのリクエストに新しいスレッドがありますか?このコードの最後で呼び出されるBeginReceiveメソッドは、非同期でも機能します。

public void Listen(IPEndPoint EndPoint)
    {
        try
        {
            ListeningSocket.Bind(EndPoint);
            ListeningSocket.Listen(BACKLOG);
            BeginAccept();
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message + "\nfrom Source: " + e.Source + "\nand Stack Trace: " + e.StackTrace);
        }
    }

    public void BeginAccept()
    {
        try
        {
            ListeningSocket.BeginAccept(new AsyncCallback(Accept_Callback), new ServerSocket());
        }
        catch (SocketException e)
        {
            Console.WriteLine("Listening Socket Error:" + e.ErrorCode);
        }
        catch (ObjectDisposedException e)
        {
            Console.WriteLine("The Listening Socket has been closed");
        }
    }


    private void Accept_Callback(IAsyncResult asyncResult)
    {
        BeginAccept();
        try
        {
            if (asyncResult.AsyncState != null)
            {
                ServerSocket serverSocket = asyncResult.AsyncState as ServerSocket;
                if ((serverSocket.CommunicationSocket = ListeningSocket.EndAccept(asyncResult)) != null)
                {

                    BeginReceive(serverSocket);
                }
            }
        }
        catch (SocketException e)
        {
            Console.WriteLine("Listening Socket Error:" + e.ErrorCode);
        }
        catch (ObjectDisposedException e)
        {
            Console.WriteLine("The Listening Socket has been closed");
        }
    }
4

1 に答える 1

0

このアプローチは、良いことである ThreadPool からのスレッドを使用します。新しいクライアントが受け入れられるか、データが到着するのを待っている間は、スレッドは使用されないため、1000 のクライアントが接続されている場合、コードは 1000 のスレッドにまたがることはありません。

データが 1 つのソケットに到着すると、トレッド プールから空きスレッドが 1 つ取得され、コールバックが処理されます。メソッドが終了すると、スレッドはプールに返され、次のデータ到着またはクライアント接続に使用できるようになります。

于 2012-11-26T15:29:02.483 に答える