在 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大语言模型的攻击行为。攻击者通过恶意提示词注入、训练数据窃取、模型逆向工…