2011-02-10 51 views
3

为了优化某些服务器端数据库调用,我决定使用System.Threading.Tasks.Task来并行化几个数据库调用,然后使用Task.WaitAll()获取所有结果,将它们打包并通过WCF将它们发送给客户端。当在Visual Studio(cassini)中对开发Web服务器进行测试时,这似乎工作正常,但在部署到IIS时不起作用。分析客户端调用(使用萤火虫)显示调用到IIS,但没有相应的调用提交给SQL Server。使用来自WCF的TPL任务

任何人都遇到过这个问题?在IIS中使用任务是否存在限制?

回答

3

没有直接限制 - 但是,当您使用任务时,它会调度ThreadPool上的任务。默认情况下,IIS为整个IIS进程共享一个单独的线程池,这可以(特别是在繁忙的服务器上)导致发生线程匮乏。这意味着有关使用ThreadPool的相同指导适用于处理任务时。请参阅this post for details

为了看看是否有这个问题,至少作为测试,您可以使用TaskCreationOptions.LongRunning提示生成所有Task实例。这将导致默认TaskScheduler在它自己的专用(新)线程上创建任务,而不是使用ThreadPool线程。虽然我不认为这是一个长期解决方案的好主意,但您可以验证它是导致您的问题的线程池匮乏。如果是,则可以确定其他选项,例如可能使用自定义TaskScheduler来管理此操作的线程/任务。

+0

谢谢里德 - 一些很好的信息。我非常有信心这不是线程匮乏,但我需要做更多的调查。我将继续发布我的发现。 – 2011-02-11 14:09:31