static int _globalId = 0;
public static void Process(object state)
{
// each queued Process call gets its own player ID to fetch
processId = InterlockedIncrement(ref _globalId);
var s = StatsFecther("byId", processId); //returns all player stats
Console.WriteLine("Account: " + s.nickname);
Console.WriteLine("ID: " + s.account_id);
Console.ReadLine();
}
Это самое простое, что нужно сделать. Но это далеко не оптимально. Вы используете синхронные вызовы, вы полагаетесь на ThreadPool для регулирования скорости вызовов, у вас нет политики повторных попыток для неудачных вызовов, и ваше приложение будет работать крайне плохо в условиях ошибки (при сбое веб-вызовов).
Сначала вы должны рассмотреть возможность использования асинхронных методов WebRequest: BeginGetRequestStream (если у вас POST и тело запроса) и / или BeginGetResponse . Эти методы масштабируются намного лучше, и вы получите более высокую пропускную способность при меньшем объеме процессора (если, конечно, серверная часть может справиться).
Во-вторых, вы должны подумать о самоуничтожении. В аналогичном проекте я использовал количество ожидающих запросов. В случае успеха каждый вызов отправляет еще 2 вызова, ограниченных счетчиком газа. В случае сбоя вызов не будет ничего отправлять. Если нет ожидающих вызовов, повторная попытка на основе таймера отправляет новый вызов каждую минуту. Таким образом, вы делаете попытку только один раз в минуту, когда служба не работает, сохраняя свои собственные ресурсы от вращения без тяги, и вы увеличиваете пропускную способность до уровня ограничения, когда служба работает.
Вы также должны знать, что .Net Framework будет ограничивать количество параллельных согласований, которые оно делает с любым ресурсом. Вы должны найти пункт назначения ServicePoint и изменить ConnectionLimit со значения по умолчанию (2) на максимальное значение, которое вы хотите настроить.
Что касается обновления базы данных, существует множество переменных и слишком мало информации, чтобы давать какие-либо содержательные советы. Некоторым общим советом было бы также использовать асинхронные методы в вызове базы данных, размер пула соединений, чтобы обеспечить ограничение скорости, убедитесь, что ваши обновления используют идентификатор игрока в качестве ключа, чтобы вы не зашли в тупик при обновлении одной и той же записи из разных потоков. .