我们来详细讲解一下C#中任务并行的两个方法Parallel.For和Parallel.ForEach的使用攻略。
Parallel.For
用法
Parallel.For是C#中的一个并行任务处理方法,可以并行处理一个区间内的多个任务。其语法格式如下:
Parallel.For(startIndex, endIndex, index => {
// 处理逻辑
});
其中:
startIndex
和endIndex
分别表示区间的起始和结束点,包含startIndex但不包含endIndex。index
为当前处理线程的索引值,从startIndex开始自增,到endIndex - 1结束。- 处理逻辑部分需要根据实际需求编写。
示例1:计算一个数组中所有元素的和
下面是一个使用Parallel.For来计算一个数组中所有元素的和的示例代码:
double[] data = new double[] { 1.0, 2.0, 3.0, 4.0, 5.0 };
double sum = 0.0;
Parallel.For(0, data.Length, i => {
Interlocked.Add(ref sum, data[i]); // 使用Interlocked避免线程冲突
});
Console.WriteLine($"result: {sum}");
在以上示例中,我们使用Parallel.For来并发计算一个数组中所有元素的和,每个线程处理对应的部分并将结果累加到sum变量中,最后输出结果。
Parallel.ForEach
用法
Parallel.ForEach也是C#中的一个并行任务处理方法,与Parallel.For类似,不同之处在于它可以并行处理一个集合类型对象中的多个元素。其语法格式如下:
Parallel.ForEach(sourceCollection, item => {
// 处理逻辑
});
其中:
sourceCollection
为需要处理的集合类型对象,可以是数组、列表等。item
为当前处理元素的值,类型自动推断。- 处理逻辑部分需要根据实际需求编写。
示例2:从多个网站并行获取数据
下面是一个使用Parallel.ForEach来从多个网站并行获取数据的示例代码:
List<string> urls = new List<string>
{
"http://www.baidu.com",
"https://www.sina.com.cn",
"https://www.qq.com"
};
ConcurrentDictionary<string, string> data = new ConcurrentDictionary<string, string>();
Parallel.ForEach(urls, url =>
{
string content = Download(url); // 模拟下载页面内容
data.TryAdd(url, content); // 添加到结果字典中
});
foreach (var item in data)
{
Console.WriteLine($"url:{item.Key},content:{item.Value.Substring(0,20)}...");
}
在以上示例中,我们使用Parallel.ForEach来并发从多个网站下载页面内容,并将结果存储到ConcurrentDictionary中。其中,模拟下载操作使用了一个Download函数,并将url和对应的页面内容添加到结果字典中。
至此,我们对C#中的任务并行Parallel.For和Parallel.ForEach有了一定的了解,相信通过这两个方法,能够为我们的程序提供更高效的性能帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#任务并行Parellel.For和Parallel.ForEach - Python技术站