Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用线程池处理新线程中的每个连接_C#_Multithreading_Sockets_Client Server - Fatal编程技术网

C# 如何使用线程池处理新线程中的每个连接

C# 如何使用线程池处理新线程中的每个连接,c#,multithreading,sockets,client-server,C#,Multithreading,Sockets,Client Server,我有一个简单的服务器,它等待客户机连接,读取传入的流,然后发送一条消息回来。我想做的是让每个连接都由一个单独的线程处理。这是我第一次在C#中使用套接字和线程,我发现的大多数示例都非常令人困惑,因此非常感谢任何帮助或简单示例 这是我现在拥有的 using System; using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Text; [STAThread]

我有一个简单的服务器,它等待客户机连接,读取传入的流,然后发送一条消息回来。我想做的是让每个连接都由一个单独的线程处理。这是我第一次在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);
        }
    }
}
试试这个:

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

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

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作为第一个参数传递。