C# 具有IAsyncResult的委托函数

C# 具有IAsyncResult的委托函数,c#,asynchronous,delegates,C#,Asynchronous,Delegates,我的任务是接管一段使用委托的旧代码 SearchDelegate[] dlgt = new SearchDelegate[numSearches]; IAsyncResult[] ar = new IAsyncResult[numSearches]; 然后它执行一个循环来启动多个委托函数 for (int i = 0; i < numSearches; i++) { ar[i] = dlgt[i].BeginInvoke(....); } for(int i=0;i

我的任务是接管一段使用委托的旧代码

SearchDelegate[] dlgt = new SearchDelegate[numSearches];
IAsyncResult[] ar = new IAsyncResult[numSearches];
然后它执行一个循环来启动多个委托函数

for (int i = 0; i < numSearches; i++)
{
    ar[i] = dlgt[i].BeginInvoke(....);
}
for(int i=0;i
然后它执行一个定时循环以从ar对象获得结果

一切似乎都很好。我遇到的问题是,有时这些委托函数中的一些可能需要3到4秒才能启动,如果计数超过10,则启动时间甚至更长。这是一个常见的问题,还是有一个设置我可以调整

这是在IIS上运行的。我可以用最少的机器资源在本地复制问题

谢谢大家

达斯

启动可能需要3到4秒

是由线程池引起的。当所有线程都忙时,它只会缓慢地(2/秒)创建新线程


你可以增加池中线程的最小数量,但特别是对于一个web应用程序,你应该进行广泛的研究、测试和测量。ASP.NET也是threadpool中的一大利益相关者

BeginInvoke
方法将实际工作分派到线程池,如本文所述。实际上,当没有可用的空闲线程时,这可能需要一些时间。线程池可能会决定等待某些工作项完成,或者添加额外的线程,并考虑最小和最大限制

一些额外的信息可以在这里和那里找到,也可以在本文的备注部分找到

您应该知道,相同的线程池用于HTTP请求处理,因此在web应用程序中将自定义的非IO绑定工作卸载到线程池中通常是毫无意义的,因为它不会给您带来任何好处,甚至可能由于额外的线程切换而影响性能。而
BeginInvoke
看起来并不是异步IO操作的调用

实际上,哪个具体线程执行工作并不重要——客户机仍然需要等待相同的响应时间。看起来,通过并行执行工作,您可能会赢得一些时间,但在负载下是不可能的,因为线程池中没有可用的线程来处理HTTP请求和自定义工作项


您可能想查看此主题的其他详细信息。它与任务相关,但这并不重要,因为
BeginInvoke
Task.Run
都在后台使用相同的线程池。

Asp.Net线程池不同于托管线程池,在运行过程中需要处理的资源更为宝贵programming@MrinalKamboj我甚至不认为ASP.NET线程池这种特定的东西存在。IIS将请求处理分派到同一CLR管理的线程池。当然,IIS下的池的默认值可能不同,对于最大并发请求等,还有额外的配置调整,但对于OP的问题来说,这些都是无关紧要的。