Я начал возиться с многопоточностью для выполняемого мной пакетного процесса, интенсивно использующего процессор. По сути, я пытаюсь сжать несколько одностраничных мелочей в один 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);
}
});