c#Blazor WebAssembly在網頁中多線程計算1000萬次求余

在 Blazor WebAssembly 中實現多線程計算并獲取線程 ID 是可行的,但需要正確配置多線程環境并處理線程安全和 UI 更新邏輯。以下是完整示例和檢測方法:

一、準備工作:啟用多線程支持

首先需確保項目已啟用 WebAssembly 多線程,修改項目文件(.csproj):xml

<Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly"><PropertyGroup><TargetFramework>net8.0</TargetFramework><Nullable>enable</Nullable><ImplicitUsings>enable</ImplicitUsings><!-- 啟用多線程 --><WASMEnableThreads>true</WASMEnableThreads></PropertyGroup><ItemGroup><PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="8.0.0" /><PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="8.0.0" PrivateAssets="all" /></ItemGroup>
</Project>

同時,服務器需配置跨域隔離頭部(確保?SharedArrayBuffer?可用)。如果使用?dotnet run?調試,需在?Properties/launchSettings.json?中添加:

"profiles": {"http": {"environmentVariables": {"ASPNETCORE_ENVIRONMENT": "Development","ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.WebAssembly.Server"},"applicationUrl": "http://localhost:5000"},"https": {"environmentVariables": {"ASPNETCORE_ENVIRONMENT": "Development","ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.WebAssembly.Server"},"applicationUrl": "https://localhost:5001;http://localhost:5000"}
}

跨域隔離頭部會由 Blazor 開發服務器自動添加,生產環境需在服務器(如 Nginx/Apache)配置?Cross-Origin-Opener-Policy: same-origin?和?Cross-Origin-Embedder-Policy: require-corp

二、完整代碼實現:多線程計算示例

修改?Counter.razor,添加多線程計算邏輯:razor

@page "/counter"
@using System.Threading
@using System.Collections.Concurrent
@inject IJSRuntime JSRuntime<PageTitle>Counter</PageTitle><h1>Counter</h1>
<p role="status">Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button><hr /><!-- 多線程測試區域 -->
<h3>多線程計算測試</h3>
<button class="btn btn-success" @onclick="StartMultiThreadCalculation">開始多線程計算</button>
@if (results.Any())
{<div class="mt-3">@foreach (var result in results){<p>線程 ID: @result.ThreadId | 耗時: @result.ElapsedMs ms | 7的倍數個數: @result.Count</p>}</div>
}@code {private int currentCount = 0;private List<ThreadResult> results = new();// 線程安全的結果隊列(子線程寫入,主線程讀取)private ConcurrentQueue<ThreadResult> resultQueue = new();private void IncrementCount(){currentCount++;}// 線程計算結果模型private class ThreadResult{public int ThreadId { get; set; }public long ElapsedMs { get; set; }public int Count { get; set; }}// 啟動3個線程private void StartMultiThreadCalculation(){results.Clear();resultQueue.Clear();// 線程1:計算 0 ~ 999萬var thread1 = new Thread(CalculateMod7) { IsBackground = true };thread1.Start(0);// 線程2:計算 1000萬 ~ 1999萬var thread2 = new Thread(CalculateMod7) { IsBackground = true };thread2.Start(10_000_000);// 線程3:計算 2000萬 ~ 2999萬var thread3 = new Thread(CalculateMod7) { IsBackground = true };thread3.Start(20_000_000);// 啟動定時器,定期檢查結果隊列并更新UI(子線程不能直接更新UI)var timer = new Timer(_ =>{// 切換到UI線程更新InvokeAsync(() =>{while (resultQueue.TryDequeue(out var result)){results.Add(result);}StateHasChanged(); // 強制刷新UI});}, null, 0, 100); // 每100ms檢查一次}// 線程執行的計算邏輯:統計1000萬個數中i mod 7 == 0的數量private void CalculateMod7(object? startObj){if (startObj is not int start) return;int end = start + 10_000_000; // 每個線程計算1000萬次int count = 0;// 獲取當前線程ID(托管線程ID)int threadId = Thread.CurrentThread.ManagedThreadId;var stopwatch = System.Diagnostics.Stopwatch.StartNew();// 執行計算for (int i = start; i < end; i++){if (i % 7 == 0){count++;}}stopwatch.Stop();// 將結果存入線程安全隊列resultQueue.Enqueue(new ThreadResult{ThreadId = threadId,ElapsedMs = stopwatch.ElapsedMilliseconds,Count = count});}
}

三、關鍵實現說明

  1. 多線程創建
    使用?System.Threading.Thread?創建 3 個線程,分別處理不同起始范圍的計算(0~1000 萬、1000 萬~2000 萬、2000 萬~3000 萬)。

  2. 線程 ID 獲取
    通過?Thread.CurrentThread.ManagedThreadId?獲取托管線程 ID(Blazor WASM 中支持,可區分不同線程)。

  3. 線程安全與 UI 更新

    • 子線程不能直接更新 UI,需通過?ConcurrentQueue?存儲結果(線程安全隊列)。
    • 使用?Timer?定期檢查隊列,通過?InvokeAsync?切換到 UI 線程更新結果列表。
  4. 計算邏輯
    每個線程循環 1000 萬次,統計能被 7 整除的數字個數,記錄耗時和線程 ID。

四、檢測方法:驗證多線程執行

  1. 觀察線程 ID
    運行后點擊 “開始多線程計算”,會顯示 3 個不同的?ThreadId(如 3、4、5),說明確實啟用了多線程。

  2. 監控 CPU 使用率
    打開任務管理器(Windows)或活動監視器(Mac),計算過程中瀏覽器進程的 CPU 使用率會明顯上升,說明多線程并行執行。

  3. 網絡請求檢測
    打開瀏覽器開發者工具(F12)的?Network?面板,整個計算過程中無任何 HTTP 請求,證明邏輯由本地 WASM 線程處理,而非服務器回調。

  4. 調試線程執行
    在?CalculateMod7?方法中設置斷點(需在瀏覽器開發者工具的?Sources?面板中找到對應代碼),調試時可看到斷點在不同線程中觸發。

五、運行結果示例

點擊 “開始多線程計算” 后,會顯示類似結果:plaintext

線程 ID: 3 | 耗時: 235 ms | 7的倍數個數: 1428572
線程 ID: 4 | 耗時: 241 ms | 7的倍數個數: 1428571
線程 ID: 5 | 耗時: 239 ms | 7的倍數個數: 1428571
  • 不同的?ThreadId?證明多線程生效。
  • 耗時相近說明線程并行執行(總耗時約等于單線程耗時,而非 3 倍)。

總結

Blazor WebAssembly 中的多線程計算完全在客戶端通過 WASM 執行,無 HTTP 回調。通過?Thread?類創建線程,ManagedThreadId?獲取線程 ID,配合線程安全隊列和 UI 線程切換,可實現多線程任務并正確顯示結果。網絡監控和線程 ID 驗證可證明邏輯在本地 WASM 中執行。

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

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

相關文章

鼠標右鍵沒有“通過VSCode打開文件夾”

1, WinR 打開運行&#xff0c;輸入regedit&#xff0c;打開注冊表&#xff0c;找到HKEY_CLASSES_ROOT\*\shell分支&#xff0c;如果沒有shell分支&#xff0c;則在*下點擊右鍵&#xff0c;選擇“新建&#xff0d;項”&#xff0c;建立shell分支。 2, 在shell下新建“VisualCod…

[ Spring 框架 ] 框架搭建和屬性賦值

目錄 1. Spring定義: (1). IOC( Inversion of Control): (2). AOP (Aspect Oriented Programming): (3)一站式: 2. spring搭建: (1). 創建一個Maven項目 (2). 導入核心 jar包 (3). 編寫 spring 配置文件 (4). 編寫實體類,并生成set方法 (5). 在resource中加入spring核…

前端 大文件分片下載上傳

前端 大文件分片下載上傳 背景介紹&#xff1a; 當前項目是給投行部門做系統&#xff0c;業務方需要有專門的文檔中心去管理文件&#xff0c;包括但是不限于文件的上傳和下載等等。筆者本來就是采用的瀏覽器表單上傳的方式進行文件上傳&#xff0c;但是誰曾想在進行稍微大一點的…

【Python練習】097. 編寫一個函數,實現簡單的版本控制工具

097. 編寫一個函數,實現簡單的版本控制工具 097. 編寫一個函數,實現簡單的版本控制工具 示例代碼 功能說明 使用方法 注意事項 實現方法 基于文件快照的實現方法 基于差異存儲的實現方法 基于命令模式的實現方法 基于Git-like的實現方法 097. 編寫一個函數,實現簡單的版本控…

嵌入式硬件篇---Tof

TOF 的原理與本質TOF&#xff08;Time of Flight&#xff0c;飛行時間&#xff09;是一種通過測量信號&#xff08;通常是光&#xff09;在空間中傳播時間來計算距離的技術。其本質是利用 “距離 速度 時間” 的物理公式&#xff1a;通過發射信號&#xff08;如激光、紅外光&…

Vue diff簡介

Vue3 diff 最長遞增子序列雙端diff 理念 相同的前置和后置元素的預處理&#xff0c;考慮邊界情況&#xff0c;減少移動&#xff1b;最長遞增子序列&#xff08;動態規劃、二分法&#xff09;&#xff0c;判斷是否需要移動 操作 前置與后置預處理判斷是否需要移動 遞增法&#x…

羅技MX Anywhere 2S鼠標修復記錄

【現象】單擊時總是出現雙擊的現象 【問題原因】從網絡收集&#xff1a; 說法1&#xff0c;歐姆龍微動損壞&#xff1b;說法2&#xff0c;按鍵磨損導致按鍵和微動開關接觸不良&#xff1b; 【問題排查】 微動損壞&#xff1a;拆掉殼子后&#xff0c;用手按住左鍵的微動開關&…

常見IP模塊的仲裁策略和實現

在一個 Message Unit 中包含兩個 Core&#xff08;處理器核心&#xff09;&#xff0c;它們之間訪問共享資源&#xff08;如寄存器、FIFO、buffer 等&#xff09;時&#xff0c;仲裁機制&#xff08;Arbitration&#xff09; 是確保系統穩定性和正確性的關鍵。以下是常見的仲裁…

上周60+TRO案件,波比的游戲時間/丹迪世界/飛盤/迪奧/多輪維權,手表/汽車品牌持續發力,垃圾桶專利等新增侵權風險!

賽貝整理上周&#xff08;2025年8月11日-8月15日&#xff09;的TRO訴訟案件發案情況&#xff0c;根據賽貝TRO案件查詢系統了解到&#xff0c;上周合計發起了超60起訴訟案件&#xff0c;涵蓋 IP /品牌、版權、專利等多個領域&#xff0c;涉及影視、奢侈品、汽車、游戲、日常用品…

用 Python 在 30 分鐘內搭一個「可回放的實時日志」——把攻擊流量變成可視化劇情

業務背景 我們運營一款 FPS 端游&#xff0c;外掛作者常把 DDoS 偽裝成「玩家掉線」來騙客服。以前排查要撈 CDN 日志、對時間戳、人工比對&#xff0c;平均 2 小時才能定位。現在用一條 30 行的 Python 腳本把邊緣節點日志實時打到 Kafka&#xff0c;再回放到 Grafana&#xf…

如何將 LM Studio 與 ONLYOFFICE 結合使用,實現安全的本地 AI 文檔編輯

人工智能正在改變我們的工作方式——但如今大多數 AI 工具都存在弊端&#xff1a;速度和便利性雖有所提升&#xff0c;但也意味著數據需要發送到外部服務器。對于教育工作者、企業、非政府組織以及任何處理敏感信息的人來說&#xff0c;這都是不可接受的風險。 LM Studio 和 O…

超市電商銷售分析項目:從數據分析到業務決策

國際超市電商銷售數據分析實戰&#xff1a;從數據清洗到業務決策的完整流程 在電商行業&#xff0c;數據是驅動業務增長的核心引擎。本文將以國際超市電商銷售數據為研究對象&#xff0c;完整拆解從數據準備 → 深度分析 → 策略輸出的實戰流程&#xff0c;涵蓋數據清洗、多維度…

GitHub 熱榜項目 - 日榜(2025-08-17)

GitHub 熱榜項目 - 日榜(2025-08-17) 生成于&#xff1a;2025-08-17 統計摘要 共發現熱門項目&#xff1a;12 個 榜單類型&#xff1a;日榜 本期熱點趨勢總結 本期GitHub熱榜呈現三大技術趨勢&#xff1a;1) AI基礎設施持續爆發&#xff0c;Archon OS和Parlant聚焦AI任務管…

記憶翻牌游戲 greenfoot 開發

記憶翻牌游戲是一種經典的益智游戲&#xff0c;玩家需要翻開卡片并記住它們的位置&#xff0c;然后找到所有匹配的卡片對。 核心玩法 游戲開始時&#xff0c;所有卡片都是背面朝上玩家每次可以翻開兩張卡片如果兩張卡片圖案相同&#xff0c;則保持翻開狀態&#xff08;匹配成功…

【lucene】SegmentInfos

SegmentInfos 類中文說明 ———————————— **一句話** SegmentInfos 是 segments_N 文件的**內存表示**。它把磁盤上的 segments_N 讀進來&#xff0c;變成一堆 SegmentInfo 的集合&#xff1b;當你增刪改索引、合并段、提交時&#xff0c;再把它寫回磁盤&#x…

Read Frog:一款開源AI瀏覽器語言學習擴展

Read Frog&#xff1a;一款開源AI瀏覽器語言學習擴展 來源&#xff1a;Poixe AI Read Frog&#xff08;中文名&#xff1a;陪讀蛙&#xff09;是一款開源的瀏覽器擴展&#xff0c;旨在通過人工智能技術&#xff0c;將常規網頁瀏覽轉化為一種沉浸式的語言學習體驗。該工具通過…

天地圖應用篇:增加全屏、圖層選擇功能

天地圖應用篇&#xff1a;增加全屏、圖層選擇功能本節說明&#xff1a; 目的&#xff1a; 實現地圖的圖層切換全屏顯示 / 退出全屏案例截圖 示下&#xff1a;案例代碼示例代碼&#xff1a; <template><div class"tianditu-map-container"><!-- 頂部搜…

從零開始,系統學習AI與機器學習:一份真誠的學習路線圖

人工智能&#xff08;AI&#xff09;和機器學習&#xff08;ML&#xff09;正在深刻改變眾多行業的面貌&#xff0c;掌握這些技術已成為許多技術從業者提升競爭力的重要路徑。無論你是希望進入這個充滿潛力的領域&#xff0c;還是期望在現有技術基礎上進行拓展&#xff0c;一份…

NVIDIA CWE 2025 上海直擊:從 GPU 集群到 NeMo 2.0,企業 AI 智能化的加速引擎

前言 8 月 8 日&#xff0c;我受邀參加了在上海舉辦的 NVIDIA CWE 大會。作為一個正在企業內部推動 AI 落地的從業者&#xff0c;這場會議對我來說不僅是“充電”&#xff0c;更像是一場“解題會”。參會感受 在分享干貨之前&#xff0c;我先談談這次參會的不同感受。給我感受特…

Web攻防-大模型應用LLM安全提示詞注入不安全輸出代碼注入直接間接數據投毒

知識點&#xff1a; 1、WEB攻防-LLM安全-API接口安全&代碼注入 2、WEB攻防-LLM安全-提示詞注入&不安全輸出 Web LLM&#xff08;Large Language Model&#xff09;攻擊指針對部署在Web端的AI大語言模型的攻擊行為。攻擊者通過惡意提示詞注入、訓練數據竊取、模型逆向工…