众所周知(除了不知道的),C#5新增了一个异步等待的功能,用来来非常简单就能够实现异步等待了。规则是这样的:
在调用异步方法前面加上await关键字,并且调用该异步方法的方法前面要加上一个async关键字。
比如这样:
async void DoDelayAsync()
{
await Task.Delay(999999999);
}
在进入DoDelayAsync方法时代码同步执行,直到遇到await运算符才会开始异步等待,在等待任务执行完成之前,应用程序不会挂死,这用在用户界面上相当好,当代码在await处等 待异步操作完成的过程中,用户依然可以操作界面上的其他元素。
以前,要做到这一点,通常需要从另一个线程进行回调,使用委托来CallBack。如今使用await运算符就变得简单了N倍。
是啊,在方法内部用await异步等待,那调用的方法肯定要在前面加上async的,但是偏偏这个方法又是Main,你拿他没办法。这下可怎么办呢?
有朋友肯定会说,好办,再定义一个方法,在那方法里面再封装一个带async的方法就行了,就像这样。
class Program
{
static void Main(string[] args)
{
DoDelayAsync0();
Console.Read();
}
async static void DoDelayAsync0()
{
await Task.Delay(3000);
Console.WriteLine("Done, Done");
}
}
这样就能运行了,这方法不错。
既然方法嵌套可以解决,那用委托的结果也是等同的。
static void Main(string[] args)
{
Action act = async () =>
{
await Task.Delay(5000);
Console.WriteLine("哇哈哈,哈哈哇。");
};
// 调用委托
act();
Console.Read();
}