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 个线程。

就在数据到达一个套接字时,将从线程池中取出一个空闲线程并处理您的回调。当您的方法完成时,线程将返回到池中,以供下一次数据到达或客户端连接使用。

于 2012-11-26T15:29:02.483 回答