如何在多个线程上平衡收到的udp数据包?

时间:2019-09-03 09:48:06

标签: c# multithreading udp load-balancing

我正在创建一个应用程序,它将通过udp数据包发送和接收大量数据。我希望能够通过添加或减少更多工作线程来扩展对这些请求的处理。但是,当我添加第二个线程并开始等待数据时,出现以下错误。

“每个套接字地址(协议/网络地址/端口)通常只允许使用一种”

代码:

static void Main(string[] args)
{
    Console.WriteLine("Running...");

    Thread threadA = new Thread(new ThreadStart(ProcessMessage));
    Thread threadB = new Thread(new ThreadStart(ProcessMessage));

    threadA.Start();
    threadB.Start();

    Console.WriteLine("Press any key.");
    Console.ReadLine();
}

private static void ProcessMessage()
{
    using (var udpClient = new UdpClient(11000))
    {
        var sender = new System.Net.IPEndPoint(IPAddress.Any, 11000);
        var data = udpClient.Receive(ref sender);

        // Do work
    }
}

错误非常清楚,但是我的问题是:如何正确地在多个线程之间分配工作?

感谢您的帮助,对于任何拼写错误,我们深表歉意。 我不是说英语的人。

1 个答案:

答案 0 :(得分:0)

冈萨雷斯(C.Gonzalez)的评论非常有帮助,因此我将其作为正确答案。

处理大量UDP的通常方法是让一个线程尽可能快地消耗数据(并将消息的内容放入队列中)。 (任何适度的新硬件都可以像网络发送数据一样快地接收数据)一个或多个其他线程清空并处理数据。如果需要响应,可以将其放入传出队列中,以便另一个专用线程将消息发送出去(您可以使用与此专用线程相同的套接字)。同样,任何相对较新的硬件都可以轻松地以线速发送和接收双工模式。