Код: Выделить всё
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
}
}
Мне пришла в голову эта идея, но она тоже выглядит не очень красиво...
Код: Выделить всё
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