我想知道.Net HttpClient
async
方法是在新线程中运行还是在主线程中运行。
例如,在我的控制台应用程序中,我调用async
方法使用HttpClient.GetStringAsync
方法下载网址内容。
此方法(GetStringAsync)是否会在新的单独线程中运行?
答案 0 :(得分:5)
通常,异步I / O方法不使用单独的线程。我在我的博文There Is No Thread中详细解释了这一点。
然而,在这个特定情况下,这并不完全正确。 .NET中基于WebRequest
的API支持异步操作很长一段时间,但实际上总是将HTTP代理检测和DNS查找作为同步进行,即使是通过异步API也是如此。当HttpClient
开始变得流行时,就注意到了这一点。不幸的是,微软决定不来修复这些长期存在的错误。
因此,HttpClient
将其WebRequest
调用包装在线程池线程中。请注意,它仍在使用"异步" API,因此只在线程池线程上完成同步部分(HTTP代理和DNS查找);请求的其余部分是真正异步的。至少,某些平台也是如此。
答案 1 :(得分:0)
没有。因为使用async / await主要是为了异步完成IO绑定任务而不创建新线程。只有CPU绑定任务才会创建新线程。