代码内容:
CancellationTokenSource cts = new CancellationTokenSource();
List<string> itemsToProcess = Enumerable.Range(1, 100).Select(x => x.ToString()).ToList(); //创建一个包含100个字符串的列表,每个字符串都是一个整数转换而来

//// 利用Parallel.ForEach高效并行处理凑集
try
{
ParallelOptions options = new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount, CancellationToken = cts.Token };
Parallel.ForEach(itemsToProcess, options,
(item, loopState) =>
{
var processor = new ItemProcessor();
// 在这里实行并发任务
if (loopState.ShouldExitCurrentIteration)
{
return;
}
processor.Process(item);
// 可选操作:检讨是否已要求取消循环
if (options.CancellationToken.IsCancellationRequested)
{
// 如果检测到取消要求,则应终止当前任务的处理
loopState.Break(); // 利用 Break() 方法而不是 Stop()
return;
}
// 其他干系操作...
});
}
catch (OperationCanceledException)
{
Console.WriteLine("Processing was cancelled.");
}
finally
{
cts.Dispose();
}
Console.WriteLine("Finished processing all items."); // 当所有项都处理完毕后输出提示信息
public class ItemProcessor // 假设有一个类用于处理凑集项
{
public void Process(string item)
{
// 这里是对单个凑集项进行操作的代码
Console.WriteLine($"Processing: {item}");
// 实际场景下可能涉及到繁芜打算、数据库操作或其他耗时任务
}
}
这段代码写法具有明显的上风:
并行处理:充分利用多核CPU资源,显著提升处理速率。对付大量数据的处理,传统的串行办法会受限于单个处理器的速率。通过并行处理,可以同时利用多个处理器核心,大大提高处理速率。简洁灵巧:通过Lambda表达式简洁地定义并行处理逻辑,易于阅读和掩护。利用Parallel.ForEach简化了并行处理的代码构造,使开拓者专注于处理单个元素,而不必担心线程管理和同步。掌握并发量:通过MaxDegreeOfParallelism属性可以自定义并发级别,防止过多线程导致资源争抢。利用时把稳:
对付涉及共享资源的操作,须要确保线程安全,如利用锁或者其他同步机制。如果处理过程中存在数据依赖性(即一个任务须要基于前一个任务的结果),则不适宜利用Parallel.ForEach,由于它无法担保元素的实行顺序。把稳掌握内存花费,避免一次性加载大量数据导致内存溢出。虽然并行处理可以提高性能,但过多的并行度并不总是好事。如果任务间的通信和同步本钱过高,可能会揠苗助长。根据实际情形调度并行度。如果有超时需求或可中断性哀求,需关注并精确利用CancellationTokenSource和IProgress<T>等赞助工具。要确保代码中不存在去世锁或竞态条件等可能导致禁绝确结果的问题。利用同步机制时尤其要小心。对付短生命周期的轻量级任务,利用任务池(如Task.Run)可能更为高效。对付重打算或大数据处理任务,Parallel.ForEach更为得当。实际调用办法和实行结果为: