引言
1 async/await 是 .NetFramework 4.5 版本 中的功能
2 async/await 是C# 保留 关键字,通常成对出现
3 async修饰方法,放在方法类型前面,可以单独出现,但是单独出现和普通方法功能一样,而且还有警告
4 await 在方法体中,只能出现在 task 或 async 方法前面,单独出现会报错
async/await执行顺序
1 在async修饰的方法中,遇到await关键字,即返回到主方法执行后面的逻辑。
2 当被await修饰的任务执行完毕后,再执行await后面的代码
3 await后面的代码执行完毕后,再回到主方法继续执行
例如:下面代码块的执行顺序即为打印的数字顺序
注意:NoReturn1和NoReturn2 实现的是相同的功能,可以理解为async/await对异步回调进行了包装
唯一不同的是:
NoReturn1方法中await后面的代码也是task所在线程执行,
NoReturn2方法中的回调是又重新启动一个线程来执行
static void Main()
{
Console.WriteLine($"1 Thread ID:{Thread.CurrentThread.ManagedThreadId}");
NoReturn1();
//NoReturn2();
Console.WriteLine("3 main thread do something");
Thread.Sleep(3000);
Console.WriteLine("7 main thread do otherthings");
}
static async void NoReturn1()
{
Console.WriteLine($"2 主线程,Thread ID:{Thread.CurrentThread.ManagedThreadId}");
var task = Task.Run(() =>
{
Console.WriteLine($"4 Thread ID:{Thread.CurrentThread.ManagedThreadId}");
Thread.Sleep(2000);
});
await task;
Console.WriteLine("5 do something");//子线程执行
Console.WriteLine($"6 Thread ID:{Thread.CurrentThread.ManagedThreadId}");//子线程执行
}
static void NoReturn2()
{
Console.WriteLine($"主线程,Thread ID:{Thread.CurrentThread.ManagedThreadId}");
var task = Task.Run(() =>
{
Console.WriteLine($"Thread ID:{Thread.CurrentThread.ManagedThreadId}");
Thread.Sleep(2000);
});
task.ContinueWith(t =>
{
Console.WriteLine("do something");
Console.WriteLine($"Thread ID:{Thread.CurrentThread.ManagedThreadId}");
});
}
无返回值时,async Task== async void
static async void AsyncAwaitTest()
{
Console.WriteLine($"11 主线程,Thread ID:{Thread.CurrentThread.ManagedThreadId}");
Task t = NoReturnTask();
Console.WriteLine($"11 Thread ID:{Thread.CurrentThread.ManagedThreadId}");
t.Wait();//阻塞线程
await t;
}
static async Task NoReturnTask()
{
var task = Task.Run(() =>
{
Console.WriteLine($"22 Thread ID:{Thread.CurrentThread.ManagedThreadId}");
Thread.Sleep(2000);
Console.WriteLine("22 do sub thread things");
});
await task;
Console.WriteLine("22 do sub thread other things");
}