【问题标题】:How can I use a threadpool to process each connection in a new thread如何使用线程池处理新线程中的每个连接
【发布时间】:2010-12-16 00:37:27
【问题描述】:

我有一个简单的服务器,它等待客户端连接、读取传入流并发送回消息。我想做的是让每个连接都由一个单独的线程处理。这是我第一次在 C# 中使用套接字和线程,我发现的大多数示例都非常令人困惑,因此非常感谢任何帮助或简单示例。

这是我现在拥有的。

using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;

    [STAThread]
    static void Main(string[] args)
    {
        TestServer ts = new TestServer();
         ts.Start();
    }

class TestServer
{
    private readonly int port = 48888;
    private readonly IPAddress ip = IPAddress.Parse("127.0.0.1");

    private TcpListener listener;

    public TestServer()
    {
       this.listener = new TcpListener(this.ip, this.port);
    }

    public void Start()
    {
        this.listener.Start();
        Console.WriteLine("Server Running...");

        Socket s;
        Byte[] incomingBuffer;
        int bytesRead;
        Byte[] Message;

        while (true)
        {
            s = this.listener.AcceptSocket();

            incomingBuffer = new Byte[100];
            bytesRead = s.Receive(incomingBuffer);
            string message = "Hello from the server";
            Message = Encoding.ASCII.GetBytes(message.ToCharArray());

            s.Send(Message);
        }
    }
}

【问题讨论】:

    标签: c# multithreading sockets client-server


    【解决方案1】:

    试试这个:

    public void Start()
    {
        this.listener.Start();
        Console.WriteLine("Server running...");
    
        while (true)
        {
            Socket s = this.listener.AcceptSocket();
            ThreadPool.QueueUserWorkItem(this.WorkMethod, s);
        }
    }
    
    private void WorkMethod(object state)
    {
        using (Socket s = (Socket)state)
        {
            byte[] buffer = new byte[100];
            int count = s.Receive(buffer);
            string message = "Hello from the server";
            byte[] response = Encoding.ASCII.GetBytes(message);
            s.Send(response);
        }
    }
    

    【讨论】:

      【解决方案2】:

      不直接回答您的问题,但是...

      线程池不是关于“每个连接的新线程”,它们是关于已经运行并等待工作的一些有意义的线程(与盒子上的核心数量有一定关系)。此“工作”由生产者线程(在您的情况下接受连接的线程)通过一个或多个队列提供给池。

      请注意,这并不总是最好的解决方案。看看C10KHight Performance Server Architecture 页面。

      【讨论】:

        【解决方案3】:

        使用线程池。您可以手动使用实例化线程,但由于您可能有大量连接,因此线程池更有效。

        System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(processMessage), socket);
        

        processMessage 是处理消息的方法。每个连接将有一个线程。其实很简单。

        【讨论】:

        • ThreadPool.QueeuUserWorkItem(this.processMessage, socket) 和 ThreadPool.QueueUserWorkItem(new WaitCallBack(processMessage), socket) 有什么区别?
        • @Tester101:第一个参数必须是 WaitCallback 类型的委托。你不能直接在那里传递一个方法。所以我将方法包装在委托中并传递它。您不能直接将 processMessage 作为第一个参数传递。
        猜你喜欢
        • 2018-12-04
        • 1970-01-01
        • 2011-04-02
        • 1970-01-01
        • 2019-07-07
        • 2010-12-27
        • 1970-01-01
        • 2012-03-31
        相关资源
        最近更新 更多