Я обновляю свой набор навыков параллелизма. Моя проблема кажется довольно распространенной: читать из нескольких Uris, анализировать и работать с результatom и т.д. У меня есть параллелизм в С# Cookbook. Есть несколько примеров использования GetStringAsync, таких как
static async Task<string> DownloadAllAsync(IEnumerable<string> urls)
{
var httpClient = new HttpClient();
var downloads = urls.Select(url => httpClient.GetStringAsync(url));
Task<string>[] downloadTasks = downloads.ToArray();
string[] htmlPages = await Task.WhenAll(downloadTasks);
return string.Concat(htmlPages);
}
Мне нужен асинхронный шаблон для запуска нескольких асинхронных задач, захвата полного или частичного успеха.
- URL 1 успешен
- URL 2 успешен
- Сбой URL-адреса 3 (тайм-аут, неверный формат Uri, 401 и т.д.)
- URL 4 успешен
- ... еще 20 со смешанным успехом
ожидание задачи DownloadAllAsync вызовет единственное статистическое исключение, если произойдет сбой, отбросив накопленные результаты. Из моего ограниченного исследования, когда WhenAll или WaitAll ведут себя одинаково. Я хочу перехватывать исключения, регистрировать сбои, но продолжать работу с оставшимися задачами, даже если все они терпят неудачу. Я мог бы обрабатывать их один за другим, но разве это не противоречит цели, позволяющей TPL управлять всем процессом? Есть ли ссылка на шаблон, который будет выполнять это простым способом TPL? Возможно, я использую не тот инструмент?