Многопоточность для цикла с сохранением порядка

Я начал возиться с многопоточностью для выполняемого мной пакетного процесса, интенсивно использующего процессор. По сути, я пытаюсь сжать несколько одностраничных мелочей в один PDF-документ. Это отлично работает с циклом foreach или стандартной итерацией, но может быть очень медленным для нескольких 100-страничных документов. Я попробовал следующее, основываясь на некоторых примерах, которые я обнаружил для использования многопоточности, и у него есть значительные улучшения производительности, однако он стирает порядок страниц вместо 1,2,3,4, он будет 1,3,4,2,6,5 на какой поток завершается первым.

У меня вопрос: как я могу использовать эту технику, сохраняя порядок страниц, и если я смогу, сведет ли это на нет выигрыш в производительности от многопоточности? Заранее спасибо.

PdfDocument doc = new PdfDocument();
string mail = textBox1.Text;
string[] split = mail.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);

int counter = split.Count();

// Source must be array or IList.
var source = Enumerable.Range(0, 100000).ToArray();
// Partition the entire source array.
var rangePartitioner = Partitioner.Create(0, counter);
double[] results = new double[counter];
// Loop over the partitions in parallel.
Parallel.ForEach(rangePartitioner, (range, loopState) =>
{
    // Loop over each range element without a delegate invocation.
    for (int i = range.Item1; i < range.Item2; i++)
    {
        f_prime = split[i].Replace(" " , "");
        PdfPage page = doc.AddPage();
        XGraphics gfx = XGraphics.FromPdfPage(page);
        XImage image = XImage.FromFile(f_prime);
        double x = 0;
        gfx.DrawImage(image, x, 0);

    }
});
6
задан P.K 28 December 2010 в 03:31
поделиться