使用WCF中的TPL任务

时间:2011-02-10 20:04:37

标签: wcf iis task task-parallel-library

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

有人经历过这个吗?在IIS中使用任务是否有限制?

1 个答案:

答案 0 :(得分:3)

没有直接限制 - 但是,当您使用Task时,它会在ThreadPool上安排Task。默认情况下,IIS为整个IIS进程共享一个线程池,这可能(尤其是在繁忙的服务器上)导致线程不足。这意味着在处理任务时应用有关使用ThreadPool的相同指导。请参阅this post for details

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