Вы находитесь в параллельном цикле, поэтому наиболее вероятным поведением является то, что каждый из 10 потоков будет запускаться, попытаться подключиться к вашему API с ключом с истекшим сроком действия, а затем все завершится неудачно, выдав исключение.
Существует несколько разумных решений:
Проверьте ключ перед его использованием
Может ли первый цикл цикла пройти?например:
var ids = new ConcurrentBag<string>();
var apiKey = ctx.ApiKey.FirstOrDefault();
bool expired = true;
try {
// Perform API calls
expired = false;
}
catch(Exception ex) {
// log to database once
}
// Or grab another, newer key?
if (!expired)
{
Parallel.ForEach(ids.Skip(1), id =>
{
// Perform API Calls
}
}
Это будет работать вполне разумно, если, вероятно, срок действия ключа истек до его использования, но будет активным во время его использования.
Сохраните ошибки
Если ключ, возможно, действителен при запуске, но срок его действия может истечь во время его использования, вы можете попытаться перехватить этот сбой и затем зарегистрировать его в конце.
var ids = new ConcurrentBag<string>();
var apiKey = ctx.ApiKey.FirstOrDefault();
// Assume the key hasn't expired - don't set to false within the loops
bool expired = false;
Parallel.ForEach(ids.Skip(1), id =>
{
try {
// Perform API calls
}
catch (Exception e) {
if (e.Message == "Expired") {
// Doesn't matter if many threads set this to true.
expired = true;
}
}
if (expired) {
// Log to database once.
}
}