spo*_*ner 2 asp.net ado.net multithreading threadpool
我们目前正在增强一个ASP.NET应用程序,可以对许多产品执行引用.
目前,现有的引用引擎基本上是一个大的存储过程(每次调用2-3秒),然后是在过程调用之后运行的少量业务逻辑.
我们正在考虑对每个产品进行多线程调用,以加快一组报价.
我们当前的方法是将每个产品报价工作封装在ThreadPool线程中.这似乎表现得更好,但我有点担心虽然它在少数用户中表现良好,但它能在生产环境中很好地扩展吗?
请注意,目前我们没有使用异步ADO.NET方法.
注意:我们调用ThreadPool的代码具有对请求进行排队的限制,因此我们一次只能使用ThreadPool中可配置数量的线程.我们也不需要在同一页面上等待报价结果,我们允许用户前进并检查更新(报价结果页面使用AJAX来检查结果).
进一步说明:首选解决方案是使用消息队列,因为报价服务是单向操作.但是,该项目的时间表并没有为我们提供时间.
与此同时,我们将修改实现以使用ADO.NET的异步方法(因为这是进程的所有长期运行方面),节省了使用ThreadPool线程的需要.
使用ThreadPool线程与长时间运行的ADO.NET查询.这可扩展吗?
简短的回答是否定的,它不具备可扩展性.
原因是ThreadPool线程也用于处理常规ASP.NET请求(BeginInvoke也是如此).这些线程数量有限,当它们用完时,传入的HTTP请求将阻塞,直到线程可用.
虽然可以增加ASP.NET线程池中的线程数,但还有其他问题,例如线程数未修复的事实; 它会因负载而缓慢增加.您可以/应该使用异步页面,但仍然存在如何实际运行SP的问题.如果可以的话,切换到该部分的异步ADO.NET方法会好得多.它们的重量也比每个请求使用一个线程轻得多.
如果有帮助,我会在我的书(Ultra-Fast ASP.NET)中详细介绍这个主题.
归档时间: |
|
查看次数: |
1837 次 |
最近记录: |