我的控制台应用程序打开了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
}
}
答案 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
,这将优化已创建并计划工作的线程数。