c# - 使用 HttpClent 请求创建多个任务的最佳方法
问题描述
我想创建一个循环来测试 Web 客户端。我有一个 HttpClient,我想发送 100 个请求,每 3 秒一个。
我发送请求的功能是(async Task
因为PostAsync
):
private static async Task SendRequestAsync(HttpClient client, int taskID)
{
try
{
String xmlData = GetXmlData();
var content = new StringContent(xmlData);
HttpResponseMessage response = await client.PostAsync("sendRequest.ashx?RequestId=" + taskID, content);
// write response in a file
}
catch (Exception e)
{
}
}
现在我想:
- 创建一个 100 次迭代的循环
- 在每次迭代中调用该方法
- 等待循环后的所有任务
我写了一段代码。这是可行的,但经过一些迭代后我有一个TaskCanceledException
(并不总是相同):
List<Task> listTask = new List<Task>();
using (HttpClientHandler handler = new HttpClientHandler())
{
HttpClient client = new HttpClient(handler)
{
BaseAddress = new Uri(urlRequest)
};
client.DefaultRequestHeaders.Accept.Clear();
int cpt = 0;
while (cpt < 100)
{
cpt++;
int tmp = cpt;
listTask.Add(Task.Run(() => SendRequestAsync(client, tmp)));
Thread.Sleep(3000);
}
}
Task.WaitAll(listTask.ToArray());
是什么原因造成的TaskCanceledException
,我该如何解决?
编辑
经过一番调查,我看到我有System.ObjectDisposedException
一个对象System.Net.Sockets.NetworkStream
,但我无法识别抛出此异常的线程。
有没有办法让这个异常来自我的HttpClientHandler handler
?在这种情况下,如何重新创建对象以继续循环?
解决方案
考虑添加Task.WaitAll(listTask);
和删除Thread.Sleep(3000)
另外,您可以考虑使用任务并行库,特别是 Parrell.ForEach
推荐阅读
- python - Django HTML 遍历动态字典名称
- c# - 在 Godot 中,当我 GetNode 时,我访问的是运行时节点还是当前场景的节点?
- c# - 在循环中使用 C# 中的 ThreadPool 并等待所有线程完成
- javascript - 我正在使用 Mamp,所以我可以将 phpAdmin 用于我的 react native 项目。如何修复根文件夹
- git - git bisect 手动与 git bisect 运行
- python - ValueError:具有多个元素的数组的真值不明确。将 a.any() 或 a.all() 与 pymc3 一起使用
- json - 读取 S3 json 文件时出现 Pyspark 内存错误 - “java.lang.OutOfMemoryError:超出 GC 开销限制”
- python - 为特定请求设置日志级别。会话
- assembly - x64 汇编语言中的轮换
- .htaccess - 将子域的子目录的规则重写到另一个子目录