У меня были некоторые проблемы в коде, из-за которых слишком много открытых соединений, что приводило к их закрытию и отсутствию http-ответа.С тех пор я реорганизовал что-то похожее на это:
List<<List<string>> batches = splitListOfUrlStringsIntoBatches(urls, 50); // where 50 is the batch size
Затем я делаю:
foreach (var batchList in listOfBatchLists)
{
var insertForBatch = RunBatch(batchList);
allInsertAmounts.Add(insertForBatch);
}
и запускаю пакет выглядит так:
private int RunBatch(IEnumerable<string> batch)
{
var allWriteNum = 0;
// this will run on one bound logical thread i think
Parallel.ForEach(batch, (batchItem) => {
var res = Client.GetAsync(batchItem.Item1).GetAwaiter().GetResult();
var responseBody = res.Content.ReadAsStringAsync().GetAwaiter().GetResult();
var strongType = JsonConvert.DeserializeObject<StrongType>(responseBody);
dbContext.add(strongType);
allWriteNum++
});
return allWriteNum;
}
Вещиесли я увеличу размер пакета до 50 000, то я не получу ошибок закрытого соединения, и теперь я не уверен, почему ..
Это потому, что в Parallel.foreach есть оптимизация для создания наилучшего количества задачи это может как-то сработать, что это вызовет слишком много открытых соединенийили слишком много работы процессора?