如何使用Parallel.ForEach方法在C#中并发处理大量数据?

作者:天津麻将开发公司 阅读:230 次 发布时间:2023-04-23 02:30:41

摘要:在C#语言中,我们经常需要并发处理大量数据,以此来大幅提升程序运行效率。而在此种情境下,Parallel.ForEach方法无疑是一个非常好的选择。它可以让我们方便地进行并发编程,从而实现高效的数据处理。本文就将从以下几个方面详细介绍Parallel.ForEach方法。1. Parallel.ForEa...

在C#语言中,我们经常需要并发处理大量数据,以此来大幅提升程序运行效率。而在此种情境下,Parallel.ForEach方法无疑是一个非常好的选择。它可以让我们方便地进行并发编程,从而实现高效的数据处理。本文就将从以下几个方面详细介绍Parallel.ForEach方法。

1. Parallel.ForEach概述

如何使用Parallel.ForEach方法在C#中并发处理大量数据?

Parallel.ForEach方法是.NET框架提供的一个强大的并发编程方法。它可以方便地并发迭代遍历一个集合(数组,List等),并对每个元素执行相同的操作。Parallel.ForEach方法的定义如下:

```

public static ParallelLoopResult ForEach(

IEnumerable source,

Action body

)

```

其中:

- source:要遍历的集合,可以是数组、List或者其他类型的IEnumerable集合。

- body:对集合中的每个元素所执行的操作,一般为一个Action委托。

Parallel.ForEach方法还有其他重载形式,包括允许传入ParallelOptions选项的重载版本和允许访问迭代器当前元素索引的重载版本。

2. Parallel.ForEach的使用

在进行Parallel.ForEach方法使用前,需要引入System.Threading.Tasks命名空间。下面以简单例子来演示如何使用Parallel.ForEach方法。

我们先以一个数组为例,对于每个元素,都使用Thread.Sleep方法来模拟对该元素的一些计算。代码如下:

```

// 初始化一个数组

int[] nums = Enumerable.Range(1, 10_000).ToArray();

// 处理数组

DateTime start = DateTime.Now;

Parallel.ForEach(nums, num =>

{

// 模拟对num进行计算

Thread.Sleep(num % 50);

});

DateTime end = DateTime.Now;

Console.WriteLine($"用时:{(end - start).TotalSeconds} 秒");

```

上述代码中,我们使用Enumerable.Range方法初始化一个包含10000个元素的数组。在Parallel.ForEach方法中,我们对于每个元素都使用Thread.Sleep(num % 50)方法来模拟对该元素进行计算处理。最终,我们输出执行时间,以判断方法的效率问题。

运行代码后,可以得到如下输出结果:

```

用时:0.5749219 秒

```

可以看到,Parallel.ForEach方法的效率非常高,能够快速处理数据。

3. Parallel.ForEach性能优化

虽然Parallel.ForEach方法可以有效提升数据处理效率,但在实际编程中,为获得更好的效果,我们还需要对其进行优化。下面就介绍几种常见的优化手段。

(1)设置最大并发度

Parallel.ForEach方法可以同时处理多个元素,这就需要消耗更多的计算资源。有时候,我们需要控制并发处理的最大数量,以免消耗过多的计算资源。这个问题可以通过指定ParallelOptions.MaxDegreeOfParallelism来解决。代码示例如下:

```

Parallel.ForEach(nums, new ParallelOptions { MaxDegreeOfParallelism = 4 }, num =>

{

// 模拟对num进行计算

Thread.Sleep(num % 50);

});

```

在上述代码中,我们使用MaxDegreeOfParallelism选项将最大并发度设置为4。这个选项可以控制并发处理的最大数量,以达到节省资源的目的。

(2)取消并行处理任务

有时候,我们需要在处理大量数据时退出并行处理。这种情况下,我们可以使用CancellationTokenSource对象来实现对任务的取消。代码示例如下:

```

CancellationTokenSource cts = new CancellationTokenSource();

CancellationToken token = cts.Token;

try

{

Parallel.ForEach(nums, new ParallelOptions { CancellationToken = token },

(num, loopState) =>

{

// 如果取消任务

if (condition)

{

cts.Cancel();

loopState.Break();

}

// 模拟对num进行计算

Thread.Sleep(num % 50);

});

}

catch (OperationCanceledException)

{

Console.WriteLine("任务已被取消!");

}

```

在上述代码中,我们使用CancellationTokenSource对象和ParallelOptions选项的CancellationToken属性来实现对任务的取消。在处理过程中,我们可以通过Break方法来中止所有未执行的迭代。同时,我们还可以捕获OperationCanceledException异常,以便在任务取消时对其中正在执行的数据进行恢复或者清理操作。

(3)使用局部变量

当我们在Parallel.ForEach方法中处理大量数据时,使用局部变量能够有效提升程序的效率。这是因为,当没有使用局部变量时,每个线程都需要在堆栈中创建一个副本,导致内存开销增加。而使用局部变量后,线程池中将设置减少,进而提高程序的效率。我们可以使用ParallelLoopState类来实现局部变量。代码示例如下:

```

int sum = 0;

Parallel.ForEach(nums, () => 0, (num, loopState, subtotal) =>

{

// 模拟对num进行计算

Thread.Sleep(num % 50);

return subtotal + num;

},

subtotal =>

{

// 在循环结束时累加局部变量

Interlocked.Add(ref sum, subtotal);

});

Console.WriteLine($"总和:{sum}");

```

在上述代码中,我们使用第三个参数来定义局部变量subtotal。同时,我们使用了Interlocked.Add方法累加局部变量,以确保线程安全。最终,我们输出所有元素的总和。

4. 总结

本文介绍了Parallel.ForEach方法的主要功能及其使用。Parallel.ForEach方法提供了一个易于使用的并发编程工具,能够方便地对大量数据进行处理。同时,本文还介绍了一些常用的Parallel.ForEach性能优化技巧,如设置最大并行度、取消并行处理任务、使用局部变量等。这些技巧能够极大地提高数据处理效率,使程序更加高效。

  • 原标题:如何使用Parallel.ForEach方法在C#中并发处理大量数据?

  • 本文链接:https:////qpzx/503.html

  • 本文由天津麻将开发公司飞扬众网小编,整理排版发布,转载请注明出处。部分文章图片来源于网络,如有侵权,请与飞扬众网联系删除。
  • 微信二维码

    CTAPP999

    长按复制微信号,添加好友

    微信联系

    在线咨询

    点击这里给我发消息QQ客服专员


    点击这里给我发消息电话客服专员


    在线咨询

    免费通话


    24h咨询☎️:166-2096-5058


    🔺🔺 棋牌游戏开发24H咨询电话 🔺🔺

    免费通话
    返回顶部