71、C# Parallel.ForEach 詳解

Parallel.ForEach 是 .NET Framework 4.0 引入的并行編程功能的一部分,位于 System.Threading.Tasks 命名空間中。它允許你對集合中的元素進行并行處理,可以顯著提高處理大量數據時的性能。

基本用法

using System;
using System.Collections.Generic;
using System.Threading.Tasks;class Program
{static void Main(){List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };// 基本形式Parallel.ForEach(numbers, number =>{Console.WriteLine($"Processing {number} on thread {Thread.CurrentThread.ManagedThreadId}");// 處理邏輯});}
}

高級用法

1. 帶分區器的 Parallel.ForEach

Parallel.ForEach(numbers, new ParallelOptions { MaxDegreeOfParallelism = 4 }, number =>
{Console.WriteLine($"Processing {number} with MaxDegreeOfParallelism = 4");
});

2. 使用 ParallelOptions 控制并行度

var options = new ParallelOptions
{MaxDegreeOfParallelism = Environment.ProcessorCount * 2, // 限制最大并行度CancellationToken = cancellationTokenSource.Token // 取消支持
};Parallel.ForEach(numbers, options, number =>
{// 處理邏輯
});

3. 帶本地初始化和最終合并

Parallel.ForEach<int, long>(numbers, () => 0, // 本地初始化(number, loopState, localSum) =>{// 處理邏輯并返回本地狀態localSum += number;return localSum;},(finalSum) =>{// 最終合并Console.WriteLine($"Partial sum: {finalSum}");Interlocked.Add(ref totalSum, finalSum);});

重要參數和特性

  • MaxDegreeOfParallelism:控制最大并行任務數
  • CancellationToken:支持取消操作
  • 分區策略:自動將集合劃分為多個分區,默認使用范圍分區
  • 異常處理:并行循環中的異常會被收集到 AggregateException 中

注意事項

  • 線程安全:確保對共享資源的訪問是線程安全的
  • 順序不保證:處理順序與集合順序無關
  • 資源消耗:過度并行化可能導致性能下降
  • 異常處理:需要適當處理 AggregateException

性能考慮

// 測量并行與非并行版本的性能差異
Stopwatch stopwatch = Stopwatch.StartNew();// 并行版本
Parallel.ForEach(numbers, number =>
{// 耗時操作
});stopwatch.Stop();
Console.WriteLine($"Parallel version took {stopwatch.ElapsedMilliseconds} ms");

實際應用示例

// 處理大量文件
string[] files = Directory.GetFiles(@"C:\LargeFolder");Parallel.ForEach(files, file =>
{try{ProcessFile(file);}catch (Exception ex){Console.WriteLine($"Error processing {file}: {ex.Message}");}
});

替代方案比較

  • Parallel.ForEach:適用于數據并行場景,自動分區
  • Task.WhenAll:適用于異步操作,更靈活的控制
  • PLINQ:適用于查詢場景,語法更簡潔

總結

Parallel.ForEach 是處理可并行化集合操作的強大工具,特別適合 CPU 密集型任務。正確使用時可以顯著提高性能,但需要注意線程安全、資源管理和異常處理等問題。

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/85709.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/85709.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/85709.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

生產者-消費者模式在不同操作系統上的行為差異

在多線程編程中&#xff0c;生產者-消費者模式是一種常見的設計模式&#xff0c;用于解決線程間的數據同步問題。最近&#xff0c;我在 Linux 和 macOS 上運行同一個生產者-消費者模式的程序時&#xff0c;發現它們表現出不同的行為。本文將介紹這個現象、分析其原因&#xff0…

【JS-4.1-DOM獲取元素操作】深入理解DOM操作:高效獲取頁面元素的方法與實踐

在現代Web開發中&#xff0c;DOM&#xff08;文檔對象模型&#xff09;操作是前端工程師的必備技能。而DOM操作的第一步&#xff0c;往往是從頁面中獲取我們需要操作的元素。本文將全面介紹各種獲取頁面元素的方法&#xff0c;分析它們的性能特點&#xff0c;并提供最佳實踐建議…

UE5錯誤 Linux離線狀態下錯誤 請求失敗libcurl錯誤:6無法解析主機名

UE5錯誤 Linux離線狀態下錯誤 請求失敗libcurl錯誤&#xff1a;6無法解析主機名 完整描述問題解析解決方法 完整描述 loghttp&#xff1a;warning&#xff1a;ox015cba21400:request failed libcurl error :6 (couldn’t resolve host name ) 問題解析 這是因為在離線狀態下…

深度學習實戰111-基于神經網絡的A股、美股、黃金對沖投資策略(PyTorch LSTM)

文章目錄 一、A股與美股對沖互補投資方案1. 現象與邏輯2. 對沖互補投資思路3. 資金分配樣例4. 最大化收益的關鍵二、對沖互補投資思路1. 資金分配原則2. 動態調整機制3. 對沖操作三、投資方案樣例1. 初始資金分配(假設總資金10萬元)2. 動態調整舉例情景一:美股進入牛市,A股…

在線教育平臺敏捷開發項目

項目背景 產品名稱&#xff1a;LearnFlow&#xff08;在線學習平臺&#xff09; 核心目標&#xff1a;6個月內上線MVP&#xff08;最小可行產品&#xff09;&#xff0c;支持課程學習、進度跟蹤、測驗功能。 團隊構成&#xff1a; 產品負責人&#xff08;PO&#xff09;1人 S…

C++面試題(35)-------找出第 n 個丑數(Ugly Number)

操作系統&#xff1a;ubuntu22.04 IDE:Visual Studio Code 編程語言&#xff1a;C11 題目描述 我們把只包含質因子 2、3 和 5 的數稱作丑數&#xff08;Ugly Number&#xff09;。例如 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 個丑數。 請編寫一個函數&#xff0c;找出第 n …

Day03_數據結構(手寫)

01.數據結構畫圖 02. //11.按值查找返回位置 int search_value(node_p H,int value) { if(HNULL){ printf("入參為空.\n"); return -1; …

【Java學習筆記】Collections工具類

Collections 工具類 基本介紹 &#xff08;1&#xff09;Collections 中提供了一系列靜態方法對集合元素進行排序&#xff0c;查詢和修改等操作 &#xff08;2&#xff09;操作對象&#xff1a;集合 常用方法一覽表 方法描述reverse(List<?> list)反轉 List 中元素…

spring-webmvc @ResponseBody 典型用法

典型用法 基本用法&#xff1a;返回 JSON 數據 GetMapping("/users/{id}") ResponseBody public User getUser(PathVariable Long id) {return userService.findById(id); }Spring 自動使用 Jackson&#xff08;或其他 HttpMessageConverter&#xff09;將 User 對…

AI-調查研究-08-跑步分析研究 潛在傷害與預防 不同年齡段與性別的情況

點一下關注吧&#xff01;&#xff01;&#xff01;非常感謝&#xff01;&#xff01;持續更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持續更新中&#xff01;&#xff08;長期更新&#xff09; 目前2025年06月16日更新到&#xff1a; AI煉丹日志-29 - 字節…

AI任務相關解決方案9-深度學習在工業質檢中的應用:基于DeepLabv3+模型的NEU-seg數據集語義分割研究

大家好我是微學AI,今天給大家介紹一下AI任務相關解決方案9-深度學習在工業質檢中的應用:基于DeepLabv3+模型的NEU-seg數據集語義分割研究。DeepLabv3+模型在NEU-seg數據集上實現了高達87.65%的平均交并比(mIoU),為金屬表面缺陷的高精度檢測提供了有力工具。本文將詳細探討Dee…

mysql JSON_EXTRACT JSON_UNQUOTE 函數

在處理mysql 有存儲的json字段&#xff0c;需要提取時候發現JSON_EXTRACT函數&#xff0c;發現此函數提取后會帶有引號&#xff0c;組合使用JSON_UNQUOTE 可去掉引號&#xff01; JSON_EXTRACT 函數概述 JSON_EXTRACT是MySQL中用于從JSON文檔中提取數據的函數&#xff0c;語法…

Prompt:更好的提示與迭代

歡迎來到啾啾的博客&#x1f431;。 記錄學習點滴。分享工作思考和實用技巧&#xff0c;偶爾也分享一些雜談&#x1f4ac;。 有很多很多不足的地方&#xff0c;歡迎評論交流&#xff0c;感謝您的閱讀和評論&#x1f604;。 目錄 1 引言1.1 引用資料 2 更好的提示2.1 情景學習IC…

SQL85 統計每個產品的銷售情況

SQL85 統計每個產品的銷售情況 好復雜&#xff0c;俺不中了。。 問題描述 本查詢旨在分析2023年各產品的銷售情況&#xff0c;包括&#xff1a; 每個產品的總銷售額、單價、總銷量和月均銷售額每個產品銷量最高的月份及其銷量每個產品購買量最高的客戶年齡段 解題思路 1. 基…

Django MAC Pycharm 命令行建立項目,注冊app運行失敗,找不到views導入包

相對復雜的情況 你沒有直接在Pycharm中建立一個Django項目&#xff0c;而是直接建立某個項目或者打開某個項目&#xff0c;使用命令后安裝Django后&#xff0c;使用命令后建立了Django項目&#xff0c;盡管你的目錄盡可能干凈&#xff0c;只有Django項目&#xff0c;但是這仍然…

窄帶和寬帶誰略誰優

窄帶&#xff08;Narrowband&#xff09;與寬帶&#xff08;Broadband&#xff09;深度對比 ——涵蓋 優缺點、適用場景、調制方式 1. 窄帶&#xff08;Narrowband&#xff09; 1.1 核心特點 帶寬&#xff1a;≤25 kHz&#xff08;典型值&#xff0c;如NB-IoT僅占用180kHz&a…

李佳琦直播間618收官:6成銷量為國貨,多品類增超25%

618大促迎來收官&#xff0c;作為電商消費的關鍵風向標&#xff0c;李佳琦直播間生動呈現了當下消費市場的多元趨勢。 據「TMT星球」了解&#xff0c;在長達近40天的大促里&#xff0c;李佳琦直播間不僅延續過往的高人氣與強帶貨力&#xff0c;更在高質價比產品、高質量服務保…

c++ noexcept關鍵字

noexcept 是 C11 中引入的一個關鍵字&#xff0c;用來標記函數聲明&#xff0c;表示該函數不會拋出異常。它可以用于函數、函數指針、Lambda 表達式等。使用 noexcept 可以幫助編譯器進行優化&#xff0c;提高代碼的執行效率&#xff0c;并且讓程序在處理異常時更加明確。 1. …

騰訊混元3D制作簡單模型教程-2

以下是騰訊混元3D制作簡單模型的詳細教程&#xff0c;整合最新版本特性&#xff08;截至2025年6月&#xff09;&#xff0c;操作門檻低且無需專業基礎&#xff1a; &#x1f5a5; 一、在線生成&#xff08;最快30秒完成&#xff09; ?訪問平臺? 打開 騰訊混元3D創作引擎官網…

阿里云申請ssl證書,同時需要綁定域名,下載nginx壓縮包,nginx添加證書路徑即可

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 一、ssl是什么&#xff1f;二、登錄阿里云三、圖片教程四、添加域名前綴&#xff08;www&#xff09;如&#xff1a;www.baidu.com總結 一、ssl是什么&#xff1f; …