如何在 C# 中限制 Parallel.ForEach?

1. Parallel.ForEach的使用

在C#中,如果需要对一个集合中的元素进行并行处理,可以使用Parallel.ForEach方法。

Parallel.ForEach(list, (item) =>

{

//处理item

});

其中list为要处理的集合,item是集合中的每个元素。在处理集合元素时,可以使用多线程技术,进一步提高处理速度。

2. 限制Parallel.ForEach

虽然Parallel.ForEach可以提高处理速度,但是在某些情况下,需要限制并行处理的线程数,以避免给系统带来过大的负担。例如,在使用Parallel.ForEach处理大量数据时,如果同时处理过多的数据,可能会导致系统资源不足,从而影响系统性能。

2.1 使用WithDegreeOfParallelism方法

尽管Parallel.ForEach没有提供一个直接控制并行度的参数,但是我们可以使用WithDegreeOfParallelism方法手动配置并行度来控制Parallel.ForEach中并行线程的数量。

Parallel.ForEach(list, new ParallelOptions { MaxDegreeOfParallelism = n }, (item) =>

{

//处理item

});

其中n为最大线程数。MaxDegreeOfParallelism属性用于限制Parallel.ForEach中并行线程的最大数量。

2.2 使用 CancellationTokenSource 取消并行任务

有时候,我们需要在执行Parallel.ForEach时取消并行任务。例如,在处理大量数据时,如果发现某个元素的处理结果不合法,那么可以取消并行任务以避免后续数据仍然继续处理。

取消并行任务可以通过CancellationTokenSource(CTS)来实现。CTS是取消标记的源,可以用于取消令牌。在Parallel.ForEach方法中,可以使用CancellationTokenSource.Token实现取消令牌。

下面的代码演示了如何在Parallel.ForEach方法中使用CancellationTokenSource来取消任务。

CancellationTokenSource cts = new CancellationTokenSource();

ParallelOptions po = new ParallelOptions

{

CancellationToken = cts.Token,

MaxDegreeOfParallelism = Environment.ProcessorCount

};

Parallel.ForEach(list, po, (item, loopState) =>

{

if (item.IsInvalid())

{

loopState.Break();

}

}, (item) =>

{

//处理完成后的任务

});

if (po.IsStopped)

{

throw new OperationCanceledException(cts.Token);

}

其中,CancellationTokenSource类的Token属性用于获取取消令牌。在Parallel.ForEach方法中,使用CancellationToken属性将令牌与方法关联。在执行Parallel.ForEach方法时,如果取消令牌被设置,遍历循环将被强制中止。

注意,在使用CancellationTokenSource时,遍历循环可能不会立即停止。在调用Break方法以中止循环后,需要检查IsStopped属性来确定遍历是否终止,否则遍历任务可能会在循环之外继续。

3. 结论

Parallel.ForEach是一种实现元素并行处理的方法,它可以显着提高处理速度。然而,由于并行操作可能会导致系统负载过大,因此需要适当设置并行度以避免系统过载。上述方法可以帮助我们解决这些问题并正确使用ForEach方法。

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。

后端开发标签