//.NET 异步任务 import win.ui; /*DSG{{*/ var winform = win.form(text="泛型 / 异步任务";right=759;bottom=469) winform.add( edit={cls="edit";left=9;top=9;right=743;bottom=445;edge=1;multiline=1;z=1} ) /*}}*/ winform.show(); import dotNet; //一定要在界面线程中创建异步任务,.NET 4.5 开始支持 Task.Run(Windows 10 自带 .NET 4.6)。 var Task = System.Threading.Tasks.Task; //实例化泛型指南: doc://library-guide/std/dotNet/_.md#generic var taskRun = Task.$Run(System.Int32);//缓存泛型实例,避免重复查询 var task = taskRun( function() { /* 模拟一些工作, 注意,无论 .NET 是在哪个线程执行, aardio 回调总是在调用 .NET 的同一线程执行。 */ thread.delay(1000); return 42; } ); //task 是异步任务,任务完成以后回调以下函数 task.ContinueWith( function(t) { if(t.IsFaulted){ //winform.edit.log("出错了",tostring(t.Exception)) winform.edit.log(t.Exception.Message) } elseif(!t.IsCanceled){ var result = t.Result; winform.edit.print("task.ContinueWith 完成了,返回值",result) } } ) //也可以同步等待任务完成,不会阻塞界面 if( dotNet.wait(task,winform) ){ winform.edit.print( "dotNet.wait 完成了,返回值",task.Result) } else if(task.IsCanceled){ winform.edit.print( "dotNet.wait 取消了") } else if(task.IsFaulted){ winform.edit.print( "dotNet.wait 出错了",task.Exception.Message) } //C# 代码可以下面这样异步转同步,取消和失败会抛出异常 //var result = task.GetAwaiter().GetResult(); win.loopMessage();