2012-02-11 117 views
2

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

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

UPDATE

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

回答

4

RegisterAsyncTask方法的MSDN示例中,他们只是声明一个AsyncTaskDelegate,它使用Begin和End方法调用。当你异步调用委托时,它使用线程池中的一个线程,所以在这种情况下基本上没有任何改进。唯一的速度改进可能是如果你正在并行执行多个操作,否则会同步执行。

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

看看文章asynchronous pages in ASP.NET。在那里解释IOCP更好。

+0

谢谢。查看我的更新。我刚读过这篇文章,但它没有回答这个问题。 – Pol 2012-02-11 10:18:10

+0

@Pol,因此如果您使用异步版本的方法调用Web服务,则不使用线程池中的线程。所以要回答你的问题:是的,在这种情况下,请求处理线程在Web服务调用期间被释放。 – 2012-02-11 10:22:12

+0

无论我直接在我的代码中调用'ExecuteRegisteredAsyncTasks'还是在页面处理中自动调用它?在这两种情况下,Web服务调用期间都会释放请求处理线程? – Pol 2012-02-11 15:02:10