.net异步编程中async 和await深入理解
1、await 运算符应用于异步方法中的任务,在方法的执行中插入挂起点,直到所等待的任务完成。
任务表示正在进行的工作。
2、await 仅可用于由 async 关键字修改的异步方法中。
使用 async 修饰符定义并且通常包含一个或多个 await 表达式的这类方法称为异步方法。
3、await 真正的目的只有一个 在调用异步方法 XXAsync() 时挂起此方法,它认为这个方法是比较耗时的方法,主线程或调用此方法的线程不要在此方法等待。
并同时作个标记,当前执行的线程运行结束时,将由此处恢复运行,所以在await 标记的异步方法下面的代码或方法将不能运行,必须等待这个方法完成!
4、加不加 await 与 方法是异步还是同步的并没有关系
下面写个例子讲述
5、在运行至 await XXAsync()时,调用方法XAsync()者将不再运行,直接返回,就像我们程序代码中的return语句。这样做的好处是,调用线程,不将等待此耗时线程。直接让调用线程往下运行,
6、如果调用线程向上一直存在await 链,就像方法套方法里有return一样,会逐层向上返回,一直返回到主线程,而每个“子线程”去等待耗时的I/O处理,比如 操作数据库和网络流
7、我们即要多线程或多任务执行我们的程序,让耗时的任务得到执行,同时又要给调用者快速响应,不管他有没有完成任务! 这才是真正的目的。
XXXAsync()必须等待XXAsync()方法执行结束!此时不会影响调用者的响应速度,但会影响我们代码的执行效率,这点和两个同步方法稍有区别
像上面的例子XX()和XXX()两同步方法,不仅按顺序执行,而且调用者也无法拿回调用权,也就是无法及时响应,必须待两个方法都结束为止。
笔记:关于异步编程
使用异步编程,方法调用时在后台运行(通常在线程活任务的帮助下),并且不会阻塞调用线程。
async和await只是一个标记
发现执行结果是:
这个很正常。但是我们希望先执行主线程完成标记,不改动主线程和Task的任务情况下,如何处理?
使用await和async
1.凡是使用await关键字的方法,都必须打上async标记。
2.async表示方法内有异步方法,调用async方法,会立刻另起线程执行。
3.await只是显示等待线程结束。await表示等待异步方法执行完,并取返回值。
任务表示正在进行的工作。
2、await 仅可用于由 async 关键字修改的异步方法中。
使用 async 修饰符定义并且通常包含一个或多个 await 表达式的这类方法称为异步方法。
3、await 真正的目的只有一个 在调用异步方法 XXAsync() 时挂起此方法,它认为这个方法是比较耗时的方法,主线程或调用此方法的线程不要在此方法等待。
并同时作个标记,当前执行的线程运行结束时,将由此处恢复运行,所以在await 标记的异步方法下面的代码或方法将不能运行,必须等待这个方法完成!
4、加不加 await 与 方法是异步还是同步的并没有关系
下面写个例子讲述
private static async Task XAsync() { await XXAsync(); OtherMothod(); }
5、在运行至 await XXAsync()时,调用方法XAsync()者将不再运行,直接返回,就像我们程序代码中的return语句。这样做的好处是,调用线程,不将等待此耗时线程。直接让调用线程往下运行,
6、如果调用线程向上一直存在await 链,就像方法套方法里有return一样,会逐层向上返回,一直返回到主线程,而每个“子线程”去等待耗时的I/O处理,比如 操作数据库和网络流
7、我们即要多线程或多任务执行我们的程序,让耗时的任务得到执行,同时又要给调用者快速响应,不管他有没有完成任务! 这才是真正的目的。
XXXAsync()必须等待XXAsync()方法执行结束!此时不会影响调用者的响应速度,但会影响我们代码的执行效率,这点和两个同步方法稍有区别
private static async TaskXAsync() { XX(); XXX(); }
像上面的例子XX()和XXX()两同步方法,不仅按顺序执行,而且调用者也无法拿回调用权,也就是无法及时响应,必须待两个方法都结束为止。
笔记:关于异步编程
使用异步编程,方法调用时在后台运行(通常在线程活任务的帮助下),并且不会阻塞调用线程。
async和await只是一个标记
static void Main(string[] args) { Task.Run(() => //异步开始执行 { Thread.Sleep(1000); //异步执行一些任务 Console.WriteLine("Hello World"); //异步执行完成标记 }); Thread.Sleep(1100); //主线程在执行一些任务 Console.WriteLine("Main Thread"); //主线程完成标记 Console.ReadLine(); }
发现执行结果是:
这个很正常。但是我们希望先执行主线程完成标记,不改动主线程和Task的任务情况下,如何处理?
使用await和async
static void Main(string[] args) { Say(); //由于Main不能使用async标记 Console.ReadLine(); } private async static void Say() { var t = TestAsync(); Thread.Sleep(1100); //主线程在执行一些任务 Console.WriteLine("Main Thread"); //主线程完成标记 Console.WriteLine(await t); //await 主线程等待取异步返回结果 } static async Task<string> TestAsync() { return await Task.Run(() => { Thread.Sleep(1000); //异步执行一些任务 return "Hello World"; //异步执行完成标记 }); }
1.凡是使用await关键字的方法,都必须打上async标记。
2.async表示方法内有异步方法,调用async方法,会立刻另起线程执行。
3.await只是显示等待线程结束。await表示等待异步方法执行完,并取返回值。