ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Smartstore异步状态实战:IAsyncState与ContextState深度解析指南

Smartstore异步状态实战:IAsyncState与ContextState深度解析指南 Smartstore异步状态实战IAsyncState与ContextState深度解析指南【免费下载链接】SmartstoreA modular, scalable and ultra-fast open-source all-in-one eCommerce platform built on ASP.NET Core 10项目地址: https://gitcode.com/GitHub_Trending/smar/SmartstoreSmartstore 异步状态系统是这款基于 ASP.NET Core 的开源电商平台的幕后指挥官。通过两个核心构件——IAsyncState跨服务器共享的长任务状态板和ContextState请求级的调用上下文状态Smartstore 让商品导入、数据安装等耗时任务能够实时上报进度、支持一键取消并能在多台服务器之间无缝同步状态。本文将用最简单的方式带你彻底搞懂它们。为什么电商系统需要异步状态想象一下这样的场景管理员在后台启动了一次商品导入文件里有 10 万条数据。这个任务可能要跑好几分钟期间页面上的进度条该怎么更新用户想中途取消怎么通知正在执行的服务网站部署了多台服务器负载均衡请求被分到另一台机器上时还能读到进度吗传统的把变量存在内存里做不到这些——每个服务器各管各的而且请求一结束变量就没了。Smartstore 的解决方案就是异步状态Async State把任务的状态信息写进缓存可选 Redis 分布式缓存于是任何一台服务器、任何一个请求都能随时读取进度或发出取消指令。官方文档对这个机制有完整说明async-state.mdIAsyncState长任务的共享状态板 IAsyncState是 Smartstore 提供的状态存储接口它把长任务的进度和取消信息存进缓存。核心源码在这里接口定义IAsyncState.cs默认实现DefaultAsyncState.cs它的工作流程只有 3 步非常好记步骤方法作用1️⃣ 创建CreateAsync把初始状态如进度 0%写入缓存可附带一个取消令牌2️⃣ 更新UpdateAsync任务每前进一步就刷新状态比如进度 50%3️⃣ 读取GetAsync任何请求哪怕在另一台服务器上随时取走最新进度下面是一个极简示例创建一个导入任务的状态然后在任务推进时更新它// 创建状态并挂上取消令牌 await _state.CreateAsync(new ImportState(0), import, cancelTokenSource: cts); // 任务执行过程中更新进度 await _state.UpdateAsyncImportState(s s.Progress 50, import);几个值得了解的小细节源码中都有体现键名规则缓存键由状态类型 可选名称组合而成见BuildKey方法天然避免不同任务互相覆盖滑动过期条目默认在 15 分钟无活动后自动过期读取时会自动续期。你也可以传neverExpires: true让它常驻但务必在任务结束时手动RemoveAsync清理分布式友好启用 Redis 后状态自动进入分布式缓存Web 农场里所有节点共享同一块状态板如何取消一个正在跑的任务⏹️调用CancelT()即可。它找到与该状态关联的取消令牌源并触发取消正在执行的任务会在下一个检查点优雅停止。更贴心的是当状态条目从缓存中移除或过期时对应的取消令牌也会被自动清理见 DefaultAsyncState.cs 构造函数中的事件订阅不会留下僵尸令牌。ContextState请求级随身背包 如果说 IAsyncState 是跨服务器的状态板那么ContextState就是单个请求内的状态背包。核心源码ContextState.cs它的底层依赖 .NET 的AsyncLocal——数据会自动沿着异步调用链await链路传递在一个方法里存进去的东西后面所有被await的深层方法都能取到而下一个新请求进来时又不会串数据。使用方式极其简单// 声明一个具名的上下文状态 private static readonly ContextStatebool _flag new(MyFlag); _flag.Push(true); // 存 var v _flag.Get(); // 取 _flag.Remove(); // 清框架在 Web 管道最前端就启动了上下文流确保内部所有异步作用域都能正确传播数据中间件注册ThreadingBootstrappingExtensions.csUseContextState方法管道挂载位置WebStarter.cs 第 152 行的app.UseContextState()一个实际例子ViewModel 基类 ModelBase.cs 就用ContextState在单次请求内携带自定义上下文属性避免在每一层方法签名里反复传递参数字典——这就是 ContextState 的典型价值。IAsyncState vs ContextState一张表看懂区别 维度IAsyncStateContextState作用域跨请求、跨服务器缓存/Redis仅当前请求的异步调用链数据寿命最长 15 分钟滑动过期可永久请求结束即消失典型用途长任务进度条、取消导入任务请求内共享临时数据用户标识、主题、模型上下文生命周期分钟级毫秒秒级是否依赖分布式缓存是单服务器时退回内存缓存否选择口诀任务要跑很久、要被别处查看/取消 → 用IAsyncState只是想在一次请求的调用链里少传几个参数 → 用ContextState。它们在项目里都用在哪儿任务调度器TaskExecutor.cs 执行后台任务时把任务描述写入 IAsyncState供管理端查看进度并支持取消安装/升级向导InstallationService.cs 在漫长的数据库初始化过程中用异步状态向浏览器实时汇报现在进行到哪一步了数据导入/导出如官方文档中的商品导入示例——前端 JS 每 1.5 秒轮询一次进度接口详见 async-state.md 末尾的完整示例语言资源管理XmlResourceManager.cs 用异步状态追踪资源文件的编译过程总结 IAsyncState 长任务进度与取消的分布式共享状态板三步走创建 → 更新 → 读取/取消15 分钟滑动过期自动清理ContextState 基于AsyncLocal的请求级随身背包让数据沿异步调用链自动流动代码更清爽两者配合让 Smartstore 这种模块化、可扩展的电商平台在多服务器部署下依然拥有丝滑的长任务体验上手只需两分钟注入IAsyncStateCreateAsync建个状态剩下的进度条与取消按钮就水到渠成了。【免费下载链接】SmartstoreA modular, scalable and ultra-fast open-source all-in-one eCommerce platform built on ASP.NET Core 10项目地址: https://gitcode.com/GitHub_Trending/smar/Smartstore创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表