当前位置: 首页 > news >正文

AScript异步执行与await关键字

、异步解析执行

AScript提供了 Script.EvalAsync 异步方法,异步执行脚本,可设置 CancellationToken 参数。

AScript执行模式有解析执行和编译执行两种模式,这两种模式下的异步执行又有所不同:

1)解析执行模式:异步解析,异步执行,并且异步执行脚本中 await 后面的方法;

2)编译执行模式:异步解析,同步编译,同步执行,脚本中 await 后面的方法则会调用 Task.Wait() 或者 Task<T>.Result 来等待完成。

示例:

1 var script = new Script(); 2 // 100毫秒超时 3 var cts = new CancellationTokenSource(100); 4 // 异步读取脚本文件,异步解析脚本,异步执行脚本,如果超时100毫秒则报OperationCanceledException异常 5 var result = await script.EvalAsync(File.OpenRead("mycode.txt"), cancellationToken: cts.Token); 6 Console.WriteLine($"value:{result.Value}, type:{result.Type}");

二、await关键字

脚本中调用异步方法并等待完成,使用 await 关键字,当然也可以直接调用 Task.Wait() 或者 Task<T>.Result 来等待完成,为什么推荐使用 await 呢?

1)异步执行时,脚本中的方法也是异步的;

2)同步执行时,等效于 Task.Wait() 或者 Task<T>.Result ;

3)如果 await 后面的方法不是异步方法,则自动忽略 await ;

所以脚本中使用 await 关键字更省心更安全。

示例:

1 Func<int, int, Task<int>> sum = async (a, b) => 2 { 3 await Task.Delay(1000); 4 return a + b; 5 }; 6 string s = @" 7 var a = await sum(5, 10); 8 await Task.Delay(500); 9 a + 20 10 "; 11 var script = new Script(); 12 script.Context.AddFunc("sum", sum); 13 // 异步执行 14 var result = await script.EvalAsync(s); 15 Assert.AreEqual(35, result.Value); 16 Assert.AreEqual(typeof(int), result.Type); 17 // 同步执行,等效于:var a = sum(5, 10).Result; Task.Delay(500).Wait(); a + 20 18 Assert.AreEqual(35, script.Eval(s));

await 关键字实现原理请查看源码 AScript.TokenHandlers.AwaitTokenHandler 和 AScript.Functions.AwaitFunction 。

三、@@CancellationToken关键字

1)异步执行时,值为 EvalAsync 方法参数中的 CancellationToken ;

2)同步执行时,值为 CancellationToken.None 。

示例:

1 var script = new Script(); 2 // 100毫秒超时 3 var cts = new CancellationTokenSource(100); 4 await Assert.ThrowsExceptionAsync<TaskCanceledException>(async () => 5 { 6 await script.EvalAsync("await Task.Delay(1000, @@CancellationToken)", cancellationToken: cts.Token); 7 });

实现原理:

1 public class CancellationTokenHandler : ITokenHandler, IAsyncTokenHandler 2 { 3 public static readonly CancellationTokenHandler Instance = new CancellationTokenHandler(); 4 5 public void Build(DefaultSyntaxAnalyzer analyzer, TokenAnalyzingArgs e) 6 { 7 e.IsHandled = true; 8 if (!e.Ignore) 9 { 10 e.TreeBuilder.AddData(e.BuildContext, e.ScriptContext, e.Options, e.Control, CancellationToken.None); 11 } 12 } 13 14 public async Task BuildAsync(DefaultSyntaxAnalyzer analyzer, TokenAnalyzingArgs e, CancellationToken cancellationToken) 15 { 16 e.IsHandled = true; 17 if (!e.Ignore) 18 { 19 e.TreeBuilder.AddData(e.BuildContext, e.ScriptContext, e.Options, e.Control, cancellationToken); 20 } 21 } 22 }

在 CSharpLang 中注册: AddTokenHandler("@@CancellationToken", CancellationTokenHandler.Instance);

四、总结

AScript提供了 EvalAsync 方法来异步读取、解析、执行脚本;

http://www.jsqmd.com/news/1092592/

相关文章:

  • ChatGPT企业落地最后一公里(内部绝密SOP):金融/法律/研发三大场景的5类合规性约束嵌入方案
  • 【claude code实践】让 Claude Code 修改代码:小改动任务的标准流程
  • 5分钟快速上手:ucore操作系统实验环境搭建终极指南
  • Adobe-GenP 3.0终极指南:如何免费解锁Adobe全家桶的完整功能
  • 第六章:PowerPoint 2010 核心功能与实战应用 —— 从入门到精通
  • Github 协作规范,如何让 ROCm 相关的代码提交更专业
  • GPT-5.6 如何接入 Codex?现状、配置方法与等待策略全解
  • TPIC7710EVM评估板实战:从硬件解析到GUI软件驱动的电机控制芯片验证
  • Java毕业设计-基于 SpringBoot+Vue 的公司考勤管理系统的设计与实现 前后端分离的企业员工考勤管理系统设计与开发(源码+LW+部署文档+全bao+远程调试+代码讲解等)
  • FDE落地:Codex+Skills+Agent+OPC打造自媒体落地智能体
  • XGBoost超参数实战:从理论到调优策略
  • ADB Explorer:告别命令行,Windows上最直观的Android设备文件管理工具
  • AI时代真的风水轮流转,前段时间最火的还是Claude Code,转眼间Codex就火得一塌糊涂。Codex是由OpenAI 推出的AI智能体。
  • 【JAVA毕设源码分享】基于springboot团子烘焙销售服务系统的设计与实现(程序+文档+代码讲解+一条龙定制)
  • 深入解析MSPM0 DEBUGSS与SWD接口:从调试原理到实战应用
  • 如何彻底解决Cursor试用限制:免费重置工具的终极指南
  • ChatGPT企业级应用倒计时:Gartner预警2024Q3将淘汰未集成AI协作流程的团队——现在掌握这9个嵌入式集成方案还不晚
  • 人大金仓KingbaseES V8R6 空闲会话超时与资源释放实战解析
  • 广州学校毕业典礼策划哪个机构好
  • web应用技术--第9次课后作业(Restful)
  • Ohook终极指南:3分钟实现Microsoft 365完整功能免费激活方案
  • 从入门到精通:Room EQ Wizard 5.20.13 音频测量实战指南
  • 出现python专门设
  • 2026手机抠图工具实操指南:免费无水印APP与轻量工具使用教程
  • SLAM ---- VINS 外点剔除
  • 用代码绘制专业图表:Mermaid的终极可视化解决方案
  • 暗黑破坏神2终极存档编辑器:免费开源,轻松修改D2/D2R游戏角色数据
  • Deepseek融资5000亿后首推DSpark框架,高并发下大模型响应速度显著提升!
  • cci-job-client架构设计解析:Python脚本如何简化LKP测试流程
  • 一台电脑,四人同屏:Nucleus Co-Op如何让你的游戏派对更精彩?