c# - 在不同的线程中运行 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()
}
};
解决方案
想要在不同的线程中运行每个查询。
为什么?
您确实需要了解 windows 内部如何工作以及完成端口是什么。异步方法在 NO 线程上运行——它们只是在完成后被调用到一个线程中。这实际上是基于 Windows 网络模型的 - 在它工作时没有线程。
我的问题是 Http GetAsync 方法仅在它返回一个任务时才有效,我试图返回一个 void
鉴于 GET 返回任务中的某些内容,那将完全没有用。
你的问题是这样的:
HttpResponseMessage 响应 = 等待 client.GetAsync(query);
不需要立即等待。启动所有异步获取操作,然后开始等待它们。
真正学习基础知识——你使用异步,但你仍然在线程中思考,因此你不理解异步模型真正给你什么。结果是像编程这样的货物崇拜完全抵消了异步的优势,现在询问如何通过线程重新获得它们。
推荐阅读
- android - Android 等待侦听器冻结应用程序?
- alignment - SwiftUI 中的布局与水平和垂直对齐
- php - mysqli 准备好的语句 - 你还需要转义数据吗?
- javascript - 在 JavaScript 中另一个(异步)函数完成后执行一个函数
- python - 如何编写一个 for 循环来查找阶乘并且只打印最终数字而不是整个列表
- c# - Jquery Validation 适用于默认 [Required] 但不适用于自定义类
- google-apps-script - 如何使用谷歌脚本返回所有任务
- java - 在 java web 中使用用户类型登录
- c - 为什么在分配的内存中使用 qsort 后 free 函数会崩溃?
- ios - 让客观 c 代码记住用户在屏幕上触摸过的地方