我的ASP.NET应用程序是一个下载应用程序(无页面),它从本地网络读取巨大的二进制文件(1-2 GB - >超过1小时的下载时间并提供恢复支持)并将它们流式传输到Web客户端(每个请求) - >一个大的二进制响应,所以根本没有文本/ html响应。我使用HTTP Handler(.ashx)而不是(.aspx)页面来处理请求。使用共享缓冲区和生产者 - 消费者模式主线程(来自ASP.NET线程池)创建另一个线程,他们一起完成工作。最后两个线程都退出(返回池)。
所以我有一个长时间运行的请求,使用线程池中的线程,一般不推荐但我的应用程序中没有任何页面,它是否仍然是使用ASP.NET线程池中的线程的瓶颈?
环境:server 2008 64位,IIS 7.0和.NET 4.0
对于这种情况应该考虑哪些因素? 任何评论都表示赞赏。
答案 0 :(得分:0)
如果您使用ASP.NET池中的线程来提供这些文件,那么无论可用带宽如何,您都将很快达到并发下载的硬限制。线程正在做什么并不重要;如果他们都忙/被阻止,其他请求将无法完成。
经过这么长的时间,如果不仔细配置,你也可能遇到其他麻烦;下载可能最终被取消,应用程序可能会不必要地重置。
通过ASHX处理程序提供这些文件的原因是什么?
答案 1 :(得分:0)
正如我解释here,只需在ASHX中使用IHttpAsyncHandler
实现来启动自定义线程并在asp.net线程内完成处理(从而将其返回到池中)。使用此方法,您可以每秒启动数千个下载,而不会耗尽asp.net线程池线程。 (如何以及如果您希望提供这么多请求是另一个讨论主题)
编辑:只是不要忘记在你的主题结束时调用asyncRequestState.CompleteRequest()
,否则asp.net将不知道你已经完成了请求。