【问题标题】:Run HttpClient GetAsync in different threads在不同的线程中运行 HttpClient GetAsync
【发布时间】:2021-11-08 07:35:22
【问题描述】:

我有一个场景,我有 x 个查询,我想在不同的线程中运行每个查询。

我的问题是 Http GetAsync 方法仅在它返回一个任务时才有效,我试图返回一个 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()
    }
};

【问题讨论】:

  • 你需要停止思考线程,专注于任务。 await Task.WhenAll(someQueryList.Select(threadAsync))
  • 好消息:您的thread1Create() 函数没有创建线程。

标签: c# multithreading dotnet-httpclient


【解决方案1】:

想要在不同的线程中运行每个查询。

为什么?

您确实需要了解 Windows 内部的工作原理以及完成端口是什么。异步方法在 NO 线程上运行——它们只是在完成后被调用到一个线程中。这实际上是基于 Windows 网络模型的 - 在它工作时没有线程。

我的问题是 Http GetAsync 方法只有在它返回一个任务时才有效,我 试图返回一个 void

鉴于 GET 返回任务中的某些内容,那将完全没用。

你的问题是这样的:

HttpResponseMessage 响应 = 等待 client.GetAsync(query);

不需要立即等待。启动所有异步获取操作,然后开始等待它们。

真正学习基础知识 - 你使用异步,但你仍然在线程中思考,因此你不了解异步模型真正给你什么。结果是像编程一样的货物崇拜完全抵消了异步的优势,现在询问如何通过线程重新获得它们。

【讨论】:

  • 原因,我想在不同的线程中运行每个查询是因为我试图复制一个错误,在每 7 次和 8 次运行时,时间会大幅减慢并且一直保持一致。我尝试了连续运行,但无法重现错误,现在我假设查询在不同的线程中运行。
  • 是的,你知道ServiceManager类和并行调用的限制吗?只是说 - 如果它在 8 点之后减少,那听起来完全像是一个限制。
猜你喜欢
  • 2016-06-23
  • 1970-01-01
  • 2016-04-20
  • 2013-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多