多线程控制台应用程序中的节流

时间:2019-05-28 11:49:31

标签: c# .net multithreading

我的控制台应用程序打开了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
    }
}

2 个答案:

答案 0 :(得分:1)

每次创建一个新的Thread是非常昂贵的。您不应该显式创建线程。使用task 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();

答案 1 :(得分:1)

问题是,在处理器中增加线程数比增加内核数毫无意义。

例如,您有4个核心并创建100个线程:您希望96个线程在哪里运行?他们不得不等待,由于创建和管理不必要的线程而导致性能下降。

您应该使用ThreadPool,这将优化已创建并计划工作的线程数。