在不同的线程中运行HttpClient GetAsync



我有一个场景,其中我有x个查询量,并且我希望在不同的线程中运行每个查询。

我的问题是HttpGetAsync方法只有在返回Task时才有效,我试图返回一个void,但它不起作用。但是要创建多个线程,我需要返回一个void。

public static async Task threadAsync(string query)
{      
var watch = System.Diagnostics.Stopwatch.StartNew();
try
{
watch.Restart();
HttpResponseMessage response = await client.GetAsync(query);
response.EnsureSuccessStatusCode();
string responseBody = await response.Content.ReadAsStringAsync(); 
watch.Stop();
string logData += $"Execution Time: {watch.ElapsedMilliseconds} ms, ";
watch.Reset();
var data = JObject.Parse(responseBody);
}
catch (HttpRequestException e)
{
Console.WriteLine("nException Caught!");
Console.WriteLine("Message :{0} ", e.Message);
}
}

我在Threads类中有多个具有不同查询的方法。我尝试使用GetAwaiter().GetResult(),但也没有成功。如何使用在不同的线程中运行每个查询?

public class Threads
{
public static void thread1Create()
{
string query = "SOMEQUERY";
threadAsync(query).GetAwaiter().GetResult()
}
};

希望在不同的线程中运行每个查询。

为什么?

您真的需要了解windows是如何在内部工作的,以及完成端口是什么。异步方法在无线程上运行——它们只是在完成后被调用到线程中。这实际上是基于windows网络模型——工作时没有线程。

我的问题是Http GetAsync方法只有在返回Task时才能工作试图返回无效

如果GET在任务中返回一些东西,那将是完全无用的。

你的问题是:

HttpResponseMessage响应=等待客户端。GetAsync(查询(;

没有立即预警的要求。启动所有异步获取操作,然后开始等待它们。

真正学习基础知识——你使用异步,但你仍然在线程中思考,因此你不明白异步模型到底给了你什么。其结果是,类似货物狂热的编程完全抵消了异步的优势,现在又在问如何通过线程重新获得这些优势。

这已经是一个老问题了,但建议不要在静态方法中执行http任务,除非您知道只有一个线程在执行请求。

HttpClient经过高度优化,可用于多线程环境。此外NET Core支持IHttpClientFactory,它为您提供了一个新的HttpClient实例。

在内部,它负责操作系统的功能,例如重用相同设备节点之间的连接(用于tcp通信(。

最新更新