C# ansyc/await/Task用法
注:Task要在.Net 4.5 环境下有效,似乎是因为:
从 C# 7 开始,返回另一个类型(通常为值类型),该类型具有 GetAwaiter 方法,可尽可能减少性能关键代码段中的内存分配。
测试代码1
private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
YBCL();
MessageBox.Show($"看看什么时候执行!");
}
private async void YBCL()
{
//await ybTest();
Task t1 = Task.Factory.StartNew(() => { Thread.Sleep(10000); MessageBox.Show($"任务进行中!"); });
MessageBox.Show($"任务已完成!");
}
public Task ybTest()
{
Task t1 = Task.Factory.StartNew(() => { Thread.Sleep(1000); });
return t1;
}
弹窗的先后顺序为
已完成->进行中->(点击“已完成”确定后)看看什么时候执行
也就是说,Task相当于开了一个线程,而后直接执行下一步的操作,点击完成后,又返回到最初的ButtonBase_OnClick函数去执行“看看什么时候执行”函数。线程结束后,自动弹出“任务进行中”。
测试代码1
private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
YBCL();
MessageBox.Show($"看看什么时候执行!");
}
//此处用await关键字
private async void YBCL()
{
await ybTest();
MessageBox.Show($"任务已完成!");
}
public Task ybTest()
{
Task t1 = Task.Factory.StartNew(() => { Thread.Sleep(1000);MessageBox.Show($"任务进行中!");});
return t1;
}
弹窗的先后顺序为
看看什么时候执行->进行中->(点击“进行中”确定后)已完成
也就是说,事件触发后,调用了异步函数YBCL(),然后不等这个函数响应,直接跳过了整个函数。而在YBCL()中,await的作用是等待ybTest()函数运算完,才开始运算下面的函数。即:await下面的函数,需要等待await 的对象 完成后 才能继续运行。
而async函数外部的代码,则是与函数内部的代码分开了。