Я отправляю пять запросов HttpClient на один и тот же URL-адрес, но с другим параметром номера страницы. Все они запускают асинхронно, и затем я жду, когда они завершат использование Tasks.WaitAll (). Мои запросы используют System.Net.Http.HttpClient.
Это в основном работает нормально, и я получаю пять разных результатов, представляющих каждую страницу данных примерно в 99% случаев.
Но каждыйтак часто, и я еще не углубился в глубокий анализ, я получаю одинаковый ответ для каждой задачи. Каждая задача действительно создает свой собственный HttpClient. Когда я повторно использовал один экземпляр клиента, у меня возникла эта проблема. Но с тех пор, как я начал создавать новые клиенты для каждого звонка, проблема исчезла.
Я звоню в стороннюю веб-службу, над которой у меня нет контроля. Поэтому, прежде чем слишком надрывать свою команду по этому поводу, я хочу знать, могу ли я что-то здесь делать неправильно или есть какой-то аспект HttpClient ot Task, который я пропускаю.
Вот вызовcode:
for (int i = 1; i <= 5; i++)
{
page = load_made + i;
var t_page = page;
var t_url = url;
var task = new Task<List<T>>(() => DoPagedLoad<T>(t_page, per_page, t_url));
task.Run();
tasks.Add(task);
}
Task.WaitAll(tasks.ToArray());
Вот код в DoPagedLoad, который возвращает задачу:
var client = new HttpClient();
var response = client.GetAsync(url).Result;
var results = response.Content.ReadAsStringAsync().Result();
Я был бы признателен за любую помощь от людей, знакомых с возможными причудами Task и HttpClient
ПРИМЕЧАНИЕ. Run - это метод расширения, помогающий с асинхронными исключениями.
public static Task Run(this Task task)
{
task.Start();
task.ContinueWith(t =>
{
if(t.Exception != null)
Log.Error(t.Exception.Flatten().ToString());
});
return task;
}