# 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; 

//一定要在界面线程中创建异步任务，.NET 4.5 开始支持 Task.Run（Windows 10 自带 .NET 4.6）。 
var Task = System.Threading.Tasks.Task;

//实例化泛型指南: https://www.aardio.com/zh-cn/docs/library-guide/std/dotNet/_.html#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();
 
```

