当我调用foo()方法时,该方法是否在单独的线程上运行?
public async Task<bool> foo(){
//Some code
}
async
关键字并不意味着会创建另一个线程。如果 CLR
发现你在 async
方法中使用 await
调用的方法存在延迟,它会退出该方法,等待已等待的方法完成,然后使用另一个线程继续执行该方法。async
的方法时,它会在当前线程上同步运行。async
不会创建自己的 thread
。调用方法的线程用于执行 async
方法,直到找到一个可等待对象。然后,相同的线程继续执行调用方法的剩余部分,在调用的 async
方法中,在返回可等待对象后,继续执行可以在线程池中的线程上执行,这是唯一需要单独的线程的地方。await
关键字的用途。典型的异步任务是等待 I/O 或网络资源在真正的异步操作开始后返回数据的任务。也可能是您的方法本身生成了自己的线程,使其异步,但这真的取决于异步方法本身的实现方式。
.ConfigureAwait(false)
等待它们,可能会导致该方法在不同的线程上被_恢复_(在等待之后),但它会在调用者的线程上同步运行。 - René Vogt