当前位置: 首页 > 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.gsyq.cn/news/1604546.html

相关文章:

  • TPIC7710EVM评估板实战:从硬件解析到GUI软件驱动的电机控制芯片验证
  • ADB Explorer:告别命令行,Windows上最直观的Android设备文件管理工具
  • XGBoost超参数实战:从理论到调优策略
  • 人大金仓KingbaseES V8R6 空闲会话超时与资源释放实战解析
  • web应用技术--第9次课后作业(Restful)
  • Win11Debloat架构解析:模块化注册表管理实现Windows系统深度优化
  • FPGA实战指南:从信号采样到频谱分析的FFT IP核全流程解析
  • 1 安装免费 Python PDF 库
  • MSPM0 G系列SYSCTL模块深度解析:时钟配置、低功耗模式与实战避坑指南
  • 报社登报声明一般多少钱?办理登报声明的流程怎么走?
  • LinkSwift:免费开源网盘下载加速工具,一键获取九大平台直链
  • 基于FPGA实现LVDS_7to1接口显示屏显示
  • BiliTools:一款让你高效管理B站资源的跨平台工具箱
  • NoFences:你的Windows桌面需要一场空间革命吗?
  • 为什么需要一个“闭环“
  • 如何用BiliTools轻松管理你的B站数字资产?3大核心功能深度解析
  • RSA非对称加密在登录模块的实战应用:从原理到前后端完整实现
  • PyTorch 实战联邦学习FedAvg:从零构建到隐私保护模型聚合
  • 如何在Windows上为所有游戏添加Steam控制器全局支持?GlosSI完整指南
  • WorkshopDL:终极Steam创意工坊下载器 - 轻松获取海量游戏模组
  • 番茄小说下载器:三步完成小说永久保存的终极解决方案
  • 终极指南:在macOS上轻松制作Windows启动盘的5个简单步骤
  • 3个场景解锁VR视频:无需专业设备也能享受沉浸式体验
  • 从代码到图表:5分钟掌握Mermaid图表生成神器,让技术文档告别单调
  • Windows 7环境下使用IDA与C32Asm静态破解Android APK实战指南
  • CentOS8环境下Zabbix 6.0 LTS部署与生产级配置实战
  • 3分钟掌握Windows窗口置顶技巧:AlwaysOnTop让你的多任务处理效率翻倍
  • 从SSR到AutoMSRCR:Retinex图像增强算法演进与实战调优指南
  • 干货合集:盘点2026年圈粉无数的的AI论文网站
  • 探索智能缠论量化框架:构建高效交易系统的完整技术指南