Я думаю, что могу настроить его на асинхронный запуск нескольких вызовов
но я не уверен, как проверить, когда все задачи были выполнены, т.е.
готов совершить в БД.
Да, вы можете разбить это
Проблема заключается в том, что ebay не имеет async Task Execute
метода, поэтому у вас остаются блокированные вызовы с нитями и без оптимизированного для ввода-вывода асинхронного шаблона ожидания. Если бы это было так, вы могли бы воспользоваться TPL Dataflow конвейером, который async
осведомлен (и интересно для всей семьи играть), вы могли бы в любом случае, хотя я предлагаю ванильный TPL решение ...
Однако, еще не все потеряно, просто вернитесь к Parallel.For
и ConcurrentBag<OrderType>
* ** 1023 тысяча двадцать-дв * Пример
var concurrentBag = new ConcurrentBag<OrderType>();
// make first call
// add results to concurrentBag
// pass the pageCount to the for
int pagesize = ...;
Parallel.For(1, pagesize,
page =>
{
// Set up
// add page
// make Call
foreach(var order in getOrders.ApiResponse)
concurrentBag.Add(order);
});
// all orders have been downloaded
// save to db
Примечание : есть MaxDegreeOfParallelism
, который вы настраиваете, возможно, установите его на 50, хотя на самом деле не имеет значения, сколько вы его дадите, Task Scheduler не собирается агрессивно давать вам темы, может быть, 10 или около того вначале и расти медленно.
Другой способ сделать это - создать свой собственный планировщик задач или просто раскрутить свои собственные потоки со старомодным Thread
Class
Я где-то читал, что хочу избежать объединения вызова API и
запись в БД, чтобы избежать блокировки на сервере SQL - это правильно?
- Если вы имеете в виду блокировку, как при медленной вставке БД, используйте Sql Bulk Insert и обновите инструменты.
- Если вы имеете в виду блокировку, как в сообщении об ошибке взаимоблокировки БД, то это совсем другое дело и заслуживает отдельного вопроса
Дополнительные ресурсы
Для (Int32, Int32, ParallelOptions, Действие)
Выполняет цикл for (For в Visual Basic), в котором могут выполняться итерации.
параллельно и параметры петли могут быть настроены.
Класс ParallelOptions
Хранит параметры, которые настраивают работу методов на параллели
класс.
MaxDegreeOfParallelism
Получает или задает максимальное количество одновременных задач, разрешенных этим
Экземпляр ParallelOptions.
Класс ConcurrentBag
Представляет потокобезопасный неупорядоченный набор объектов.