Как правильно ожидать выполнения нескольких задач ввода-вывода с индивидуальной обработкой исключений?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как правильно ожидать выполнения нескольких задач ввода-вывода с индивидуальной обработкой исключений?

Сообщение Anonymous »

Мне нужно отправить несколько HTTP-вызовов (

Код: Выделить всё

httpclient.SendAsync()
) из синхронного метода (не может быть асинхронным!) параллельно, а затем дождитесь их всех. Еще одно требование: я должен индивидуально обрабатывать исключения. Это означает, что я должен знать, какая задача вызвала какое исключение, чтобы правильно их отсортировать.
Мое решение на данный момент:

Код: Выделить всё

var listOfRequests = new List()
{1,2,3,4,5,6,7,8};

var tasks = new Dictionary();

//start all tasks
foreach (var curr in listOfRequests)
{
tasks.Add(curr.Key, httpclient.GetSomeDataFromEndpoint(curr));
}

//wait for all tasks to complete
foreach (var currTask in tasks)
{
try
{
currTask.Value.Wait();
}
catch (Exception ex)
{
//handle individual exception
}
}
Я знаю, это не лучшая практика, но как мне добиться этого с помощью Task.WhenAll()?
Мне пришла в голову эта идея, но она тоже выглядит не очень красиво...

Код: Выделить всё

try
{
// Wait for all tasks to complete synchronously
Task.WhenAll(tasks.Values).Wait();
}
catch (Exception ex)
{
//do nothing, because exceptions are handled below
}
foreach (var task in tasks)
{
if (task.Value.IsCompletedSuccessfully)
{
Console.WriteLine($"Success: {task.Key} - Status: {task.Value.IsCompleted}");
}
else if (task.Value.IsFaulted)
{
Console.WriteLine($"Exception: {task.Key} - Message: {task.Value.Exception}");
}
else
{
//maybe task was cancelled
}
}
  • Я не могу использовать await, потому что включающий метод ДОЛЖЕН БЫТЬ синхронным!
  • Я думал, что все задачи уже запущены, когда Я добавляю их в словарь (как я видел в сценариях асинхронного программирования — ожидайте завершения нескольких задач), но кажется, что мои http-вызовы отправляются в API последовательно (я вижу это в журнале API), поэтому я подумал, может быть, что-то с моим клиентским кодом и тем, как я ожидаю выполнения этих задач, может быть неправильным...
Заранее спасибо!!!


Подробнее здесь: https://stackoverflow.com/questions/790 ... n-handling
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»