Я столкнулся с довольно неудобным затруднительным положением в проекте на работе. Нам необходимо создать пользователей через 4 или 5 различных сервисов и настроить его таким образом, чтобы в случае сбоя все они терпели неудачу. Они заключены в блок транзакций.Синхронизация асинхронного вызова в C#
Одна из услуг, которые нам необходимы, чтобы добавить пользователей к необходимости telnetting и подтасовки некоторых данных. Есть и другие способы сделать это (это стоит денег), но пока это то, за чем мы застряли. Добавление одного пользователя занимает примерно 3 минуты. Мы собираемся поработать над тем, чтобы получить это значительно, как можно себе представить, но это не совсем так. Этот вызов является асинхронным, и он должен работать правильно. Пунктирная линия: между сервисом может быть не более 10 подключений.
Наш проект настроен для создания пользователей в партии. Так потенциально 50 пользователей создавались за раз. Это создает проблему, когда через telnet можно сделать только 10 подключений, и обработанный пользователь вряд ли займет очень много времени, кроме службы telnet. Теперь мне нужно синхронизировать этот процесс, чтобы остальное не могло продолжаться, пока оно не закончится.
Мы используем callbacks и делегаты с асинхронными вызовами для реализации функций. Каков был бы лучший способ инкапсулировать асинхронную часть, а не продолжать, пока она не будет завершена?
Должен ли мы настроить цикл, который завершается только после завершения вызова? Есть ли что-то в библиотеке Threading, которая могла бы помочь? Я никогда не работал с потоками раньше, так что это будет для меня первым. Какие инструменты помогут решить эту проблему?
EDIT:
Если я использую 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
Завершить вызов, пока второй делегат не завершит обработку als о? Или мне нужно будет использовать шаблоны вызова во всех делегированных вызовах?
Не уверен в вашем синтаксисе для вашего отредактированного примера. Можете ли вы уточнить, что происходит с del1? – strager