Я использую Parallel.Foreach
для работы с большим массивом, где каждый элемент массива соответствует строке в растровом изображении.Однако Parallel.Foreach
, по-видимому, выделяет фиксированное количество потоков, скажем, 6 потоков, и дает 1/6 массива первому потоку и 1/6 массива следующему потоку по порядку.пример:
[0]=>thread1, [1]=>thread1, [2]=>thread1, [3]=>thread1
[4]=>thread2, [5]=>thread2, [6]=>thread2, [7]=>thread2,
.. and so forth
![enter image description here](https://i.stack.imgur.com/sjtmA.png)
грубо говоря, я хочу использовать шаблон чередования, который чередуется между потоками для каждого приращения индекса массива ... дляпример:
[0]=>thread1 [1]=>thread2 [2]=>thread3 [4]=>thread4, [5]=>thread1, [6]=>thread2, etc...
есть ли способ изменить шаблон чередования, который Parallel.Foreach назначает каждому параллельному потоку, активно выполняющемуся?
Я пытаюсь получить изображение для рендеринга, используячересстрочный рисунок gif вместо того, чтобы строки растрового изображения отображались последовательно в 6 различных строках на изображении, которые заполняются вниз ...
using System.Threading.Tasks;
using System.Threading;
using System.Collections.Concurrent;
//…
void button_click() {
Task.Run(() =>{
start_task();
});
}
int ds_height=600;
public bool start_task()
{
var cpu75 = Convert.ToInt32(Math.Ceiling((
Environment.ProcessorCount * 0.75) * 1.0));
//MandelInit();
int[] ytmp;
int version = 2;
if (version == 1) {
ytmp = MandelYLace();
}
else {
int[] ytmp = new int[ds_height];
for(int i=0; i < ds_height; i++)
{
ytmp[i] = i;
}
Parallel.ForEach(
ytmp, //ylace,
new ParallelOptions { MaxDegreeOfParallelism = cpu75 },
yy => {
//ybuff[yy] = MandelLine(yy);
//ydone.Enqueue(yy);
}
);
stop = true;
return true;
}
// Interlace Y-Lines using GIF Interlaced method
int[] MandelYLace()
{
var ylace = new int[ds_height];
for (int y = 0, yg=0, yy=0; y < ds_height; y++)
{
ylace[y] = yy;
if (yg == 0 || yg == 1)
yy += 8;
else if (yg == 2)
yy += 4;
else if (yg == 3)
yy += 2;
if (yy >= ds_height)
{
yg = (yg + 1) % 4;
if (yg == 1) yy = 4;
else if (yg == 2) yy = 2;
else if (yg == 3) yy = 1;
else if (yg == 0) yy = 0;
}
}
return ylace;
}