用HttpClent请求创建多个任务的最佳方法

时间:2018-10-03 09:57:13

标签: c# task httpclient

我想创建一个循环来测试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?在那种情况下,如何重新创建对象以继续循环?

1 个答案:

答案 0 :(得分:0)

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

此外,您可以考虑使用任务并行库,尤其是Parrell.ForEach