come suggerito da Dunk , il modo in cui ho risolto questo problema è stato ridisegnare e utilizzare una terza entità per gestire il evento iniziale e quindi per garantire che il sequenziamento sia nell'ordine corretto.
Lo strumento scelto era Reactive Extensions (Rx) . Trovo che la descrizione di Microsoft msdn sia molto accurata:
Reactive Extensions (Rx) is a library for composing asynchronous and event-based programs using observable sequences and LINQ-style query operators.
Quindi il risultato è qualcosa del tipo:
Non ho intenzione di andare in profondità in rx, ma fondamentalmente trattiamo ogni emettitore di eventi come un flusso di dati. Questo flusso di dati viene solitamente gestito come array statico. Possiamo fare tutto ciò che vogliamo con i flussi, e se costruiamo una catena di flussi, avremo sempre un flusso aggiornato alla fine della catena.
Quindi i pro di questo approccio sono:
- Imparerai un nuovo paradigma di programmazione (se non lo sai già)
- Non è necessario reinventare la ruota creando un sistema di gestione degli eventi complesso.
- Una volta imparato, diventerà molto facile gestire grandi flussi di eventi.
Gli svantaggi:
- Devi refactoring. Può essere fatto in parte, tuttavia è necessaria una buona comprensione per farlo.
- Davvero, una curva di apprendimento DAVVERO ripida (almeno per me lo era). Non ho mai lavorato con la programmazione reattiva o funzionale, quindi per la prima volta ho impiegato me e il mio team per trasformare il nostro cervello in un pensiero funzionale.
- Un po 'complicato debug e unit test, ma non impossibile.