AScript异步执行与await关键字

发布时间:2026/10/13 3:52:14
AScript异步执行与await关键字 、异步解析执行AScript提供了 Script.EvalAsync 异步方法异步执行脚本可设置 CancellationToken 参数。AScript执行模式有解析执行和编译执行两种模式这两种模式下的异步执行又有所不同1解析执行模式异步解析异步执行并且异步执行脚本中 await 后面的方法2编译执行模式异步解析同步编译同步执行脚本中 await 后面的方法则会调用 Task.Wait() 或者 TaskT.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() 或者 TaskT.Result 来等待完成为什么推荐使用 await 呢1异步执行时脚本中的方法也是异步的2同步执行时等效于 Task.Wait() 或者 TaskT.Result 3如果 await 后面的方法不是异步方法则自动忽略 await 所以脚本中使用 await 关键字更省心更安全。示例1 Funcint, int, Taskint 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.ThrowsExceptionAsyncTaskCanceledException(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 方法来异步读取、解析、执行脚本

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询