c# - 多线程控制台应用程序中的节流
问题描述
我的控制台应用程序打开了 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
}
}
解决方案
每次创建一个新的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();
推荐阅读
- c++ - 没有运算符匹配这些操作数;操作数类型为:std::istream >> const char [5]
- html - spring如何用thymeleaf添加静态资源
- cups - 有没有办法选择使用 cupsfilter 从 txt 文件创建的 pdf 的宽度
- sql-server - 从命令行使用代理帐户执行 SSIS 包
- c++ - 从 double* 转换为 int 会失去精度
- c++ - 如何在构造函数中使用 std::optional ?
- javascript - 我可以在不使用 FileReader 文件选择选项的情况下读取文本文件吗
- java - 平面文件解析:当某些字段包含分隔符时
- elasticsearch - 使用 ONGR ES-Bundle 运行“composer update”时出错
- css - 如何停止:将标签文本向右推的元素之前