在C#中,parallel关键字用于并行计算。
在数据集的处理当中,我们需要针对每一行来进行处理,行之间没有关联,这个时候就可以应用并行处理来增加程序的灵活性。
在字典、列表或者数据集合当中也常见到这样的应用。
下面列举的是parallel应用的四种写法。
效果图:
一般的循环,结果就是同步循环:
for (int i=0;i<12;i++)
{
textBox1.Text = textBox1.Text + $"循环数:{i}" + Environment.NewLine;
}
并行写法1:
Parallel.For(0, 12, i =>
{
textBox2.BeginInvoke(() =>
{
textBox2.Text = textBox2.Text + $"循环数:{i}" + Environment.NewLine;
});
});
并行写法2:
int[] x = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
Parallel.ForEach(x, i =>
{
textBox3.BeginInvoke(() =>
{
textBox3.Text = textBox3.Text + $"循环数:{i}" + Environment.NewLine;
});
});
并行写法3:
Parallel.Invoke(
new Action(() =>
{
for (int i = 0; i < 4; i++)
{
textBox4.BeginInvoke(() =>
{
textBox4.Text = textBox4.Text + $"循环数:{i},1-4" + Environment.NewLine;
});
}
}),
new Action(() =>
{
for (int i = 4; i < 8; i++)
{
textBox4.BeginInvoke(() =>
{
textBox4.Text = textBox4.Text + $"循环数:{i},4-8" + Environment.NewLine;
});
}
}),
new Action(() =>
{
for (int i = 8; i < 12; i++)
{
textBox4.BeginInvoke(() =>
{
textBox4.Text = textBox4.Text + $"循环数:{i},8-11" + Environment.NewLine;
});
}
}));
上面的写法不明了,可以单独写成函数定义样式:
private void func1()
{
for (int i = 0; i < 4; i++)
{
textBox4.BeginInvoke(() =>
{
textBox4.Text = textBox4.Text + $"循环数:{i},0-3" + Environment.NewLine;
});
}
}
private void func2()
{
for (int i = 4; i < 8; i++)
{
textBox4.BeginInvoke(() =>
{
textBox4.Text = textBox4.Text + $"循环数:{i},4-7" + Environment.NewLine;
});
}
}
private void func3()
{
for (int i = 8; i < 12; i++)
{
textBox4.BeginInvoke(() =>
{
textBox4.Text = textBox4.Text + $"循环数:{i},8-11" + Environment.NewLine;
});
}
}
然后调用,这样看就清晰多了:
Parallel.Invoke(func1, func2, func3);
并行写法4:
int[] x = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
await Parallel.ForEachAsync(x,new ParallelOptions() { MaxDegreeOfParallelism=3},async (x,_) =>
{
textBox4.BeginInvoke(async () =>
{
textBox4.Text = textBox4.Text + $"循环数:{x}" + Environment.NewLine;
});
}
);
实际编写过程中,可以根据自己的喜好来使用这些语法糖。