异步和同步都是形容方法的,同步方法需要调用方法之后需要等待方法完成返回才能执行后续代码,当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务,调用者不用等待该方法执行完毕,我们称这个方法为异步方法。异步的好处在于非阻塞(调用线程不会暂停执行去等待子线程完成),因此我们把一些不需要立即使用结果、较耗时的任务设为异步执行,可以提高程序的运行效率。
方法用async标记后,如果方法内没有出现await,那么这个方法的调用和普通方法的调用没有区别。
有await时,在await之前的代码依然在主线程内按顺序执行,直到遇到await才线程阻塞。
await可以理解为等待方法执行完成,除了标记async外,还能标记Task,表示等待该线程完成。所以await并不是针对async方法,而是针对async方法返回给我们的Task。
async只能标记返回型为void、Task或者Task<T>的方法。
异步方法返回值:
① Task<T>:如果调用方法想通过调用异步方法获取一个T类型的返回值,那么签名必须为Task<TResult>;
② Task:如果调用方法不想通过异步方法获取一个值,仅仅想追踪异步方法的执行状态,那么我们可以设置异步方法签名的返回值为Task;
③ void:如果调用方法仅仅只是调用一下异步方法,不和异步方法做其他交互,我们可以设置异步方法签名的返回值为void,这种形式也叫做“调用并忘记”。
async与协程比较
1 、协程 2个缺点:没有返回值,yield语句无法放入try catch中
2、 async 可以规避协程的没有返回值,yield语句无法放入try catch中2个缺点
3、await Task.Run(() =>{};里面的代码是是子线程,协程是主线程里的协同线程,严格意义偏主线程里执行。
协程:
禁用 MonoBehaviour 时,不会停止协程,仅在明确销毁 MonoBehaviour 时才会停止协程。
可以使用 MonoBehaviour.StopCoroutine 和 MonoBehaviour.StopAllCoroutines 来停止协程。
销毁 MonoBehaviour 时,也会停止协程。
MonoBehaviour所绑定的GameObject,SetActive(false)时,也会停止协程。
Unity-子线程async与协程比较_unity 子线程_天添向上UT的博客-优快云博客