AScript异步执行与await关键字

发布时间:2026/6/30 0:00:09

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 方法来异步读取、解析、执行脚本

相关新闻