Лучший способ создать несколько задач с помощью запроса HttpClent - PullRequest
0 голосов
/ 03 октября 2018

Я хочу создать цикл для тестирования веб-клиента.У меня есть 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 и как я могу это исправить?

EDIT

После некоторых исследований я обнаружил, что у меня есть System.ObjectDisposedException в объекте System.Net.Sockets.NetworkStream, но я не могу определить поток, выбрасывающий это исключение.

Есть ли способ, которым это исключение пришло из моего HttpClientHandler handler?В таком случае, как я могу воссоздать объект, чтобы продолжить цикл?

1 Ответ

0 голосов
/ 03 октября 2018

Попробуйте добавить Task.WaitAll(listTask); и удалить Thread.Sleep(3000)

Кроме того, вы можете рассмотреть возможность использования Task Parallel Library, в частности, Parrell.ForEach

...