HttpClient异步方法是否会在新线程中运行

时间:2017-04-05 16:53:41

标签: c# multithreading httpclient

我想知道.Net HttpClient async方法是在新线程中运行还是在主线程中运行。

例如,在我的控制台应用程序中,我调用async方法使用HttpClient.GetStringAsync方法下载网址内容。

此方法(GetStringAsync)是否会在新的单独线程中运行?

2 个答案:

答案 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绑定任务才会创建新线程。