Mi sono imbattuto in una situazione piuttosto imbarazzante in un progetto al lavoro. Dobbiamo creare utenti su 4 o 5 servizi diversi e configurarlo in modo tale che se uno fallisce, falliscono tutti. Sono incapsulati all'interno di un blocco di ambito della transazione.Sincronizzazione di una chiamata asincrona in C#
Uno dei servizi di cui abbiamo bisogno per aggiungere utenti richiede il telneting e la fusione di alcuni dati. Ci sono altri modi per farlo (che costano soldi) ma per ora è quello con cui siamo bloccati. L'aggiunta di un utente richiede circa 3 minuti. Lavoreremo su come abbassarlo in modo significativo come si può immaginare ma non è proprio questo il punto. Questa chiamata è asincrona e deve funzionare in modo corretto. La battuta è, non ci può essere un massimo di 10 connessioni al servizio.
Il nostro progetto viene impostato per creare utenti in un batch. Quindi potenzialmente 50 utenti creati alla volta. Questo presenta un problema quando è possibile effettuare solo 10 connessioni tramite telnet e un utente elaborato non dovrebbe impiegare molto tempo oltre al servizio telnet. Ora devo sincronizzare questo processo in modo che il resto non possa continuare fino a quando non è terminato.
Utilizziamo callback e delegati con chiamate asincrone per implementare la funzionalità. Quale sarebbe il modo migliore per incapsulare la porzione asincrona e non continuare fino al completamento?
Dovremmo impostare un ciclo che termina solo al termine della chiamata? C'è qualcosa nella libreria di threading che potrebbe aiutare? Non ho mai lavorato con discussioni prima, quindi questa sarà la prima volta per me. Quali strumenti ci sono per aiutare con questo problema?
EDIT:
Se uso il/EndInvoke modello BeginInvoke, sarà asincrono chiamate entro il primo delegato onorare l'inizio/fine anche?
Esempio:
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");
// Output previsto (Fine Invoke attende fino Delegato 2 è terminata):
Delegate 1
End of Delegate 2
Delegate 2
End of Delegate 1
// O (Fine Invoke aspetta solo delegato 1 per finire, ma non qualsiasi chiamata interna delegata):
Delegate 1
End of Delegate 2
End of Delegate 1
Delegate 2
Termina invoke attendere fino a quando il secondo delegato termina l'elaborazione o? O dovrò usare i pattern di invocazione su tutte le chiamate delegate?
Non sono sicuro della sintassi per l'esempio modificato. Puoi chiarire di più cosa sta succedendo con del1? – strager