Я столкнулся с довольно неловким затруднительным положением в проекте на работе. Нам нужно создать пользователей для 4 или 5 разных сервисов и настроить их таким образом, чтобы в случае сбоя одного из них не работали все. Они инкапсулированы в блок области действия транзакции.
Одна из служб, в которую нам нужно добавить пользователей, требует подключения по телнету и подделки некоторых данных. Есть и другие способы сделать это (которые стоят денег), но пока это то, с чем мы застряли. Добавление одного пользователя занимает примерно 3 минуты. Мы собираемся работать над тем, чтобы значительно снизить это, насколько можно себе представить, но это не совсем главное. Этот вызов является асинхронным и должен работать правильно. Суть в том, что к сервису может быть не более 10 подключений.
Наш проект настроен на создание пользователей в пакетном режиме. Таким образом, потенциально 50 пользователей создаются одновременно. Это создает проблему, когда через telnet можно выполнить только 10 подключений, а обработанный пользователь вряд ли займет много времени, кроме службы telnet. Теперь мне нужно синхронизировать этот процесс, чтобы остальные не могли продолжаться, пока он не завершится.
Мы используем обратные вызовы и делегаты с асинхронными вызовами для реализации функциональности. Каков наилучший способ инкапсулировать асинхронную часть и не продолжать, пока она не будет завершена?
Должны ли мы настроить цикл, который завершается только после завершения вызова? Есть ли что-то в библиотеке Threading, что могло бы помочь? Я никогда раньше не работал с потоками, так что это будет для меня впервые. Какие есть инструменты для решения этой проблемы?
РЕДАКТИРОВАТЬ:
Если я использую шаблон BeginInvoke/EndInvoke, будут ли асинхронные вызовы в первом делегате также учитывать начало/конец?
Пример:
public void dele1(string message) {
Console.Write(message);
delegate2 del2 = new delegate2;
del2();
Console.Write("End of Delegate 2");
}
public void dele2() {
// Long Processing
Console.Write("Delegate 2");
}
public delegate void delegate1(String message);
public delegate void delegate2();
delegate1 del1 = new delegate1(dele1);
del1("Delegate 1").BeginInvoke;
del1().EndInvoke;
Console.Write("End of Delegate 1");
// Ожидаемый результат (End Invoke ожидает завершения делегата 2):
Delegate 1
End of Delegate 2
Delegate 2
End of Delegate 1
// Или (End Invoke ожидает только завершения делегата 1, но не каких-либо внутренних вызовов делегата):
Delegate 1
End of Delegate 2
End of Delegate 1
Delegate 2
Будет ли завершен вызов вызова, пока второй делегат также не завершит обработку? Или мне нужно будет использовать шаблоны вызова для всех вызовов делегатов?