@Hirty

Передать несколько переменных в Parallel.ForEach?

private void button_Click(object sender, RoutedEventArgs e)
        {
                z_prox = Convert.ToInt32(textBox.Text);
                Task.Factory.StartNew(() => {
                testx(accitem, Prox);
            });
        }
        public void testx(string[] accitem, string [] Prox)
        {
            ParallelOptions options = new ParallelOptions();
            options.MaxDegreeOfParallelism = z_prox;
            Parallel.ForEach(Prox, options, Prox1 => {indieroyale(Prox1);});
        }

Подскажите как передать несколько переменных в Parallel.ForEach?
Пробовал типа
Parallel.ForEach(Prox,accitem, options, Prox1 => {indieroyale(Prox1,ck);});

Но ошибка
  • Вопрос задан
  • 428 просмотров
Решения вопроса 1
andrewpianykh
@andrewpianykh
/*А нельзя ли просто объединить эти параметры в одну сущность, например так:
class Prox
{
    public string[] Prox1 {get;set;}
    public int[] Prox2 {get;set;}
}*/


Если количество строк в массивах равно, попробуйте, например так:

var items = new List<KeyValuePair<string, string>>();

for (int i = 0; i < Prox.Length; i++)
{
	items.Add(new KeyValuePair<string, string>(Prox[i], accitem[i]));
}

// с использованием Parallel, если массивы очень огромные
// Parallel.For(0, prox.Length, i => items.Add(new KeyValuePair<string, string>(Prox[i], accitem[i])));

Parallel.ForEach(items, options, p => indieroyale(p.Key, p.Value));


Можно заменить KeyValuePair на свой класс, с двумя полями string, сути это не меняет.

UPD: Да и вообще, зачем Вам Parallel.ForEach? Делайте все через Parallel.For, без всяких объединений:

Parallel.For(0, Prox.Length, options, i => indieroyale(Prox[i], accitem[i]));
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
А что мешает сделать из двух типов 1, в котором будут оба?
Как с событиями, EventArgs 1 шт, Sender 1 шт и хватает.
Ответ написан
@Hirty Автор вопроса
Немножко упростил
ParallelOptions options = new ParallelOptions();
            options.MaxDegreeOfParallelism = Convert.ToInt32(textBox.Text);
            Parallel.ForEach(<b>accitem, Prox,</b> options, (Prox1, ck) => {indieroyale(Prox1, ck); });

Но все равно ошибка.
Сейчас Аргументы типа для метода Parallel.ForEach(IEnumerable, Func, Func, Action) не могут определяться по использованию. Попытайтесь явно определить аргументы типа.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы