gpt4 book ai didi

c# - 多线程for循环同时保持顺序

转载 作者:太空狗 更新时间:2023-10-29 21:30:40 24 4
gpt4 key购买 nike

我开始为正在运行的 CPU 密集型批处理处理多线程。本质上,我试图将多个单页 tiff 压缩成单个 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);

}
});

最佳答案

我只想使用返回元素索引的 Parallel.ForEach 的重载:

 Parallel.ForEach(rangePartitioner, (range, loopState, elementIndex) =>

然后在您的循环中,您可以用您的工作结果填充一个数组,并在所有结果完成后按顺序检查结果。

关于c# - 多线程for循环同时保持顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4543160/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com