1: async和await 是 C# 5.0 的新特性
2: 需要.net Framework 4.5,或更高级版本才能使用
3: 需要VS2012,或更高级版本才能使用
4:它是用来配合 Task.Run(()=>{ 这里写代码 });来使用的,Task.Run是一个很方便的异步执行
5: 使用方法:
在任何方法前面加关键字 async ,比如:
public static void Main(string[] args)
{
Program p = new Program();
p.Print();
Console.ReadKey();
}
public async void Print()
{
Console.WriteLine("1111111");
Console.WriteLine("222222");
Console.WriteLine("33333333");
}
大家可以看到我在这个方法前面加了一个async,有什么用呢?然并卵,只是告诉了你这个方法变成了支持异步的方法。这个时候打印的话,结果集还是按顺序来打印
大家还需要知道一个关键字:Task ,注意Task 才是核心,async和await只不过是用来服务Task的 ,它是Task的好基友,Task 可以轻松实现异步执行;你可以把要异步执行的东西都丢在里面,那怎么用呢?比如:
public static void Main(string[] args)
{
Program p = new Program();
p.Print();
Console.ReadKey();
}
public async void Print()
{
Console.WriteLine("1111111");
Task.Run(() => {
Thread.Sleep(2000);
Console.WriteLine("222222");
});
Console.WriteLine("33333333");
}
再看看打印的结果,你会发现2222被异步执行了,先执行了11111和33333,2秒以后才出现了了222222
但是这些操作和async没有任何关系,你去掉方法的async也一样可以执行,而且结果一模一样,别急,这个时候我们再加关键字
await ,await 必须在有 关键字 async的方法中才可使用,所以代码如下:
public static void Main(string[] args)
{
Program p = new Program();
p.Print();
Console.ReadKey();
}
public async void Print()
{
Console.WriteLine("1111111");
await Task.Run(() => {
Thread.Sleep(2000);
Console.WriteLine("222222");
});
Console.WriteLine("33333333");
}
这个时候再看看运行结果
所以你现在理解了await的意思了吗?其实就是等待,一直等待到异步完成为止;这种需求很少吧?大多情况都用不到,但是如果有需求的话,可以用这种方式,这种比较代码比较清晰一些;当然也有更高深的运用,封装好多好多代码,这里就不说了,知道他的意思就好了。
另外异步的写法要写代码的话也可以这样:
//不带参数
Task.Run(() =>
{
//异步
}).GetAwaiter().OnCompleted(() =>
{
//回调
});
//带参数
Task<string> task = Task<string>.Run(() =>
{
return string.Empty;
//异步
});
task.GetAwaiter().OnCompleted(() =>
{
Console.WriteLine(task.Result);
});