【发布时间】:2011-01-17 22:27:04
【问题描述】:
我需要优化 WCF 服务...这是一件相当复杂的事情。这次我的问题与任务有关(任务并行库,.NET 4.0)。发生的情况是我在调用服务时启动了几个任务(使用Task.Factory.StartNew),然后等待它们完成:
Task.WaitAll(task1, task2, task3, task4, task5, task6);
好的...我看到但不喜欢的是,在第一次调用时(有时是前 2-3 次调用,如果一个接一个地快速进行),最后的任务开始比其他任务晚得多(我正在研究一个比其他人晚 0.5 秒开始的案例)。我试着打电话
ThreadPool.SetMinThreads(12*Environment.ProcessorCount, 20);
在我的服务开始时,但它似乎没有帮助。
这些任务都是与数据库相关的:我正在从多个数据库中读取数据,它必须花费尽可能少的时间。
知道为什么最后一个任务需要这么长时间吗?有什么我可以做的吗?
或者,我应该直接使用线程池吗?碰巧的是,在我正在查看的一种情况下,一个任务在最后一个任务开始之前已经结束 - 如果我重用该线程而不是等待创建新线程,我会节省 0.2 秒。但是,我不能确定 那个 任务总是会这么快结束,所以我不能将两个请求放在同一个任务中。
[编辑] 操作系统是 Windows Server 2003,所以应该没有连接限制。此外,它托管在 IIS 中 - 我不知道我应该创建常规线程还是使用线程池 - 这是首选版本?
[编辑] 我也尝试过使用Task.Factory.StartNew(action, TaskCreationOptions.LongRunning); - 它没有帮助,最后一个任务仍然比其他任务开始晚得多(大约半秒后)。
[编辑] MSDN1 说:
线程池有内置延迟 (.NET Framework 中的半秒 2.0 版)在开始新的空闲之前 线程。如果您的应用程序 定期启动许多任务 时间短,小幅增长 空闲线程的数量可以产生一个 吞吐量显着增加。 也设置空闲线程的数量 高消耗系统资源 不必要的。
但是,正如我所说,我已经在调用 SetMinThreads,但它没有帮助。
【问题讨论】:
-
+1 因为两年前我遇到了同样的问题,我对我的解决方案不满意。希望有人能给出一个好的答案:)
-
嗨,从其他 cmets 和您的问题来看,尚不清楚 5 个 DB 是在 5 个单独的盒子上还是都在 1 个 SQL 服务器实例上?此外,每个 WCF 调用 5 的 DB 调用的确切数量是多少,或者如果它不同,那么平均值是多少。产生的呼叫范围?我想创建一个测试并希望尽可能精确。
-
对不起,我直到现在才看到你的评论。多个盒子,不要以为有5个,但肯定不止一个。每个服务调用恰好有 6 个 DB 调用(我正在组合数据);其中两个调用是针对同一个数据库的。 (我正在我们的电话数据库中搜索家庭电话和工作电话。)
标签: c# multithreading task-parallel-library