Jim*_*uck 6 c# asynchronous task-parallel-library async-await
下面是Stephen Toub 编写的一个实现ForEachAsync
public static Task ForEachAsync<T>(this IEnumerable<T> source, int dop, Func<T, Task> body)
{
return Task.WhenAll(
from partition in Partitioner.Create(source).GetPartitions(dop)
select Task.Run(async delegate {
using (partition)
while (partition.MoveNext())
await body(partition.Current);
}));
}
Run Code Online (Sandbox Code Playgroud)
指定 partitionCount 时应考虑哪些因素(dop在本例中)?
硬件是否有所作为(内核数量、可用 RAM 等)?
数据/操作的类型是否影响计数?
我的第一个猜测是在一般情况下设置为dop等于Environment.ProcessorCount,但我的直觉告诉我这可能无关。
硬件和执行的操作都很重要。
如果您想要运行不受任何其他方式限制的 CPU 密集型工作,则根本不需要使用方法。你最好使用为此而设计的Parallelor (并且在 IO 上非常糟糕)。PLINQ
对于 IO 来说,没有简单的方法来预测最佳 DOP。例如,像 DOP 1 这样的磁盘。像 4-16(?)这样的 SSD。Web 服务几乎可以接受任何价值。我还可以继续列出更多因素,包括数据库、锁争用等。
您需要在测试环境中测试不同的量。然后,使用最佳性能值。
使用Environment.ProcessorCountIO 没有任何意义。添加 CPU 后,IO 并不会变得更快。
| 归档时间: |
|
| 查看次数: |
704 次 |
| 最近记录: |