C# 并行操作批处理

C# 并行操作批处理,c#,parallel-processing,task-parallel-library,C#,Parallel Processing,Task Parallel Library,TPL(任务并行库)中是否内置了批处理操作支持 我最近正在玩一个例程,使用查找表(即音译)对字符数组执行字符替换: for (int i = 0; i < chars.Length; i++) { char replaceChar; if (lookup.TryGetValue(chars[i], out replaceChar)) { chars[i] = replaceChar; } } 然后,我重新修改了算法,使用批处理,这样工作就

TPL(任务并行库)中是否内置了批处理操作支持

我最近正在玩一个例程,使用查找表(即音译)对字符数组执行字符替换:

for (int i = 0; i < chars.Length; i++)
{
    char replaceChar;

    if (lookup.TryGetValue(chars[i], out replaceChar))
    {
        chars[i] = replaceChar;
    }
}
然后,我重新修改了算法,使用批处理,这样工作就可以分块到不同的线程中,而不是细粒度的批处理。这使线程得到了预期的使用,我得到了一些接近线性的速度

我确信TPL中必须有对批处理的内置支持。语法是什么,如何使用

const int CharBatch = 100;
int charLen = chars.Length;

Parallel.For(0, ((charLen / CharBatch) + 1), i =>
{
    int batchUpper = ((i + 1) * CharBatch);

    for (int j = i * CharBatch; j < batchUpper && j < charLen; j++)
    {
        char replaceChar;

        if (lookup.TryGetValue(chars[j], out replaceChar))
        {
            chars[j] = replaceChar;
        }
    }
});

为了更好地让你的头脑清醒,你应该去看医生。这是一个很好的来源,并解释了如何使用第三方物流的常见方法

请看第26页(非常小的环体)。在这里,您可以找到以下示例:

Parallel.ForEach(Partitioner.Create(from, to), range =>
{
    for (int i = range.Item1; i < range.Item2; i++)
    {
        // ... process i
    }
});
Parallel.ForEach(Partitioner.Create(from,to),range=>
{
对于(int i=range.Item1;i

因此,您正在搜索的缺失部分是。

谢谢您的链接,但是您对我的问题有具体的答案吗?非常感谢。工作完美,也是一个非常好的API:)我根据你的答案用一个例子更新了我的问题。
const int CharBatch = 100;

Parallel.ForEach(Partitioner.Create(0, chars.Length, CharBatch), range =>
{
    for (int i = range.Item1; i < range.Item2; i++)
    {
        char replaceChar;

        if (lookup.TryGetValue(chars[i], out replaceChar))
        {
            chars[i] = replaceChar;
        }
    }
});
Parallel.ForEach(Partitioner.Create(from, to), range =>
{
    for (int i = range.Item1; i < range.Item2; i++)
    {
        // ... process i
    }
});