C# 限制每个类的线程数
我有一个.NET web应用程序,它为每个请求从一组多个api向其中一个api发送请求(命中哪个api取决于请求类型),获取响应,处理它并返回响应 假设在任何给定的时间点,假设我们最多有C# 限制每个类的线程数,c#,.net,multithreading,threadpool,C#,.net,Multithreading,Threadpool,我有一个.NET web应用程序,它为每个请求从一组多个api向其中一个api发送请求(命中哪个api取决于请求类型),获取响应,处理它并返回响应 假设在任何给定的时间点,假设我们最多有100个线程,我们得到100个请求(假设每个线程处理一个请求),请求需要转到API-1,API-1的响应时间突然增加,然后我们得到后续的请求,这些请求需要转到API-2,3。。。n并且所有这些API都工作得很好。只有当其中一个线程摆脱了对API-1的处理,从而对.NET web应用程序的总体性能产生影响时,才会
100个线程
,我们得到100个请求
(假设每个线程处理一个请求),请求需要转到API-1
,API-1的响应时间突然增加,然后我们得到后续的请求,这些请求需要转到API-2,3。。。n
并且所有这些API都工作得很好。只有当其中一个线程摆脱了对API-1的处理,从而对.NET web应用程序的总体性能产生影响时,才会满足对这些API的请求
我想要实现的是,我想要限制每个API的线程数(假设我们为每个API都有一个类,每个类都有一些方法),这样每个类都不会超过分配给它的最大线程数
(如果我有n个类和100个线程,我应该能够将它们划分为每个100/n的线程池)
我尝试了一个线程池,但没有达到我想要的效果。可能您的应用程序是异步编程模型的一个很好的目标,如果使用正确,可以消除阻塞线程停机问题 C#中的异步编程是一个非常广泛的话题,已经讨论了很多。检查以下资源:
- 关于堆栈溢出的讨论
- Microsoft文档页面
- 斯蒂芬·克利里的文章和他的博客
- 关于堆栈溢出的讨论
如果确实需要,仍然可以像往常一样限制线程池线程(工作线程)的数量。请参阅StackOverflow的讨论。您如何创建这些线程本身?API-i是否主要执行CPU绑定或i/O绑定的工作?@目前,将其交给IIS处理。这是异步i/O和的主要情况。每个传入请求只需要1个线程,ASP.NET会处理该请求。如果您使用异步并等待外部I/O,则不会有影响性能的API-1上等待的“阻塞线程”。请出示一些代码。很少有人能比系统管理线程或线程优先级做得更好。对asymc来说,是的,对乱搞线程池来说不是。@HenkHolterman你能详细说明线程池工作人员的限制吗?你应该对那些设置感到厌倦,当然是在ASP.NET应用程序中。ASP.NET做了大量的线程管理,不要碍事。限制线程池线程数量的原因是什么?由于每个任务都可以安排在任何空闲线程上,因此保持默认的线程数通常可以获得最佳性能。@FCin原因之一可能是为了平衡性能/地址空间和内存消耗。默认情况下,它是有限的。见Jon Skeet的答案。