首页 > 解决方案 > 使用 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)
    {
    }
}

现在我想:

我写了一段代码。这是可行的,但经过一些迭代后我有一个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?在这种情况下,如何重新创建对象以继续循环?

标签: c#taskhttpclient

解决方案


考虑添加Task.WaitAll(listTask);和删除Thread.Sleep(3000)

另外,您可以考虑使用任务并行库,特别是 Parrell.ForEach


推荐阅读