首页 > 解决方案 > 多线程控制台应用程序中的节流

问题描述

我的控制台应用程序打开了 100 个完全相同的线程 - 将一些日期发送到内部网络中的主机。主机反应灵敏,我检查过它每秒可以处理更多的请求。控制台应用程序也非常原始且响应迅速(它不使用数据库或其他东西) - 它只向主机发送请求。增加线程数并不能提高速度。似乎有些东西限制了应用程序与主机的通信速度。此外,我同时运行了同一个控制台应用程序的三个实例,它们的时间增加了 3 倍,所以似乎限制是应用程序的一个级别。

我已经增加了 DefaultConnectionLimit 但没有效果。

class Program
{
    static void Main(string[] args)
    {
        System.Net.ServicePointManager.DefaultConnectionLimit = 200;

        for (var i = 1; i <= 100; i++)
        {
            int threadId = i;
            Thread thread = new Thread(() =>
            {
                Testing(threadId);
            });
            thread.Start();
        }
    }

    private static void Testing(int threadId)
    {
        //just communicate with host
    }
}

标签: c#.netmultithreading

解决方案


每次创建一个新的Thread都是非常昂贵的。您不应该显式创建线程。改用任务 api在线程池上运行它:

var tasks = new Task[100];
for (var i = 0; i < 100; i++)
{
    int threadId = i;
    tasks[i] = Task.Run(() => Testing(threadId));
}
Task.WhenAll(tasks).GetAwaiter().GetResult();

推荐阅读