运行 不同线程中的 HttpClient GetAsync

Run HttpClient GetAsync in different threads

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

我的问题是 Http GetAsync 方法只有在它 return 是一个任务时才有效,我试图 return 无效但它没有用。但是要创建多个线程,我需要 return 一个 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 class 中有多个方法具有不同的查询。我尝试使用 GetAwaiter().GetResult(),但这也没有用。如何在不同线程中使用 运行 每个查询?

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

want to run each query in a different thread.

为什么?

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

My problem is the Http GetAsync method only works when it returns a Task, I tried to return a void

鉴于 GET Returns 任务中的某些内容,那将是完全无用的。

你的问题是这样的:

HttpResponseMessage response = await client.GetAsync(query);

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

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