Я обновляю свой набор навыков параллелизма. Моя проблема кажется довольно распространенной: читайте из нескольких Uris, разбирайте и работайте с результатом и т. Д. У меня есть Concurrency in C# 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 выходит из строя (тайм-аут, плохой формат Ури, 401 и т.д.)
- Url 4 успешно
- ... 20 больше с переменным успехом
Ожидание в задаче DownloadAllAsync будет генерировать одно обобщенное исключение, если какой-либо сбой, сбросив накопленные результаты. Из моих ограниченных исследований, когда WhenAll или WaitAll ведут себя одинаково. Я хочу поймать исключения, зарегистрировать неудачи, но продолжать с оставшимися задачами, даже если они все терпят неудачу. Я мог бы обрабатывать их один за другим, но разве это не победит цель позволить TPL управлять всем процессом? Есть ли ссылка на шаблон, который бы выполнил это в чистом виде TPL? Возможно, я использую неправильный инструмент?
Как вы относитесь к исключениям? –