ExecuteRegisteredAsyncTasks是否释放请求处理线程以服务其他请求?

时间:2012-02-11 10:11:31

标签: c# asp.net .net web-services iis

我注意到从ExecuteRegisteredAsyncTasks调用返回后的代码在与此调用之前的代码相同的线程中执行。所以我理解手动调用ExecuteRegisteredAsyncTasks并不会释放请求处理线程来为其他请求提供服务,并且只应自动调用此方法以获得扩展优势?

在msdn上是示例代码,但帮助不回答这个问题。

更新

在我的情况下,在PageAsyncTasks我异步调用Web服务(使用Begin *和End *),所以我没有使用线程池。

1 个答案:

答案 0 :(得分:4)

RegisterAsyncTask方法的MSDN示例中,它们只是声明了使用Begin和End方法调用的AsyncTaskDelegate。当您异步调用委托时,它使用线程池中的线程,因此在这种情况下您基本上没有任何改进。唯一的速度提升可能是您并行执行多个操作,否则这些操作将同步执行。

如果您希望获得真正的性能提升,则需要使用IOCP(I / O完成端口)。它们适用于I / O密集型任务,例如网络调用(数据库调用,Web服务调用......)。不适合CPU密集型任务。因此,假设您要使用WebClient.DownloadStringAsync方法执行HTTP调用。此方法不使用线程池中的线程。它向内核注册IOCP并触发HTTP请求。当它向调用者返回控制时,在整个HTTP请求持续时间内没有消耗线程。请求完成后,将发出IOCP信号,并从线程池中抽取一个线程来处理结果。

查看asynchronous pages in ASP.NET文章。 IOCP在那里得到了更好的解释。