aardio 文档

aardio 范例: 在 aardio 中显式构建 .NET 泛型 - 异步任务示例

//在 aardio 中显式构建 .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; 
var Task = System.Threading.Tasks.Task;

/*
$开头的 .NET 类名或函数名表示创建泛型类或函数(构造具体类型),
参数为一个或多个.NET类或类型名称(字符串)参数。

支持以下写法:
Task.$Run("System.Int32")  
Task.$Run(System.Int32) 
Task.$Run(0) //传入其他参象,自动获取该对象的 .NET 类型。 
Task.Run.$(System.Int32)  //Task.Run 是一个类才能这样写

一定要在界面线程中创建异步任务,.NET 4.5 开始支持 Task.Run。
*/
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)    
}

//C# 代码可以下面这样异步转同步,取消和失败会抛出异常
//var result = task.GetAwaiter().GetResult(); 

win.loopMessage();

Markdown 格式