async await
同步函数执行到async时会同步执行,当在async里遇见await时,会跳出async函数到外部继续执行。
await执行完了后再执行async里面await之后的代码
async函数由于返回的是task类型,注意属性有同步类型
- 函数参数不能有out ref,必须返回Task
- 不应混合使用同步和异步代码,异步最好始终异步123456789101112131415161718192021public static class DeadlockDemo{private static async Task DelayAsync(){await Task.Delay(1000);}// This method causes a deadlock when called in a GUI or ASP.NET context.public static void Test(){//开始延迟函数var delayTask = DelayAsync();// 等待延迟完成delayTask.Wait();}}//test方法在gui和aps.net会出现死锁,控制台不会//这种死锁的根本原因是 await 处理上下文的方式//默认情况下,当等待未完成的 Task 时,会捕获当前“上下文”,在 Task 完成时使用该上下文恢复方法的执行//GUI 和 ASP.NET 应用程序具有 SynchronizationContext,它每次仅允许一个代码区块运行。//当 await 完成时,它会尝试在捕获的上下文中执行 async 方法的剩余部分。//但是该上下文已含有一个线程,该线程在(同步)等待 async 方法完成。它们相互等待对方,从而导致死锁。
- 不应混合使用同步和异步代码,异步最好始终异步
await不像Task.Run(),它并不会创建线程来执行,只会移交权限来继续执行。
我一开始想这玩意,不创建新线程咋个优化呢。后面他们说会挂起执行其它函数,这样并发的时候就能很好处理,不会卡住。