首页 > 解决方案 > 在不同的线程中运行 HttpClient GetAsync

问题描述

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

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

标签: c#multithreadingdotnet-httpclient

解决方案


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

为什么?

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

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

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

你的问题是这样的:

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

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

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


推荐阅读