In qualche modo non posso credere di essere il primo a imbattersi in quel problema (e non voglio credere di essere l'unico abbastanza stupido da non vedere direttamente una soluzione), ma il mio search-fu non era forte abbastanza.Come evitare il codice spaghetti quando si utilizzano gli eventi di completamento?
Mi imbatto regolarmente in una situazione, quando devo eseguire alcuni passaggi che richiedono tempo uno dopo l'altro. Il flusso di lavoro si presenta come
var data = DataGetter.GetData();
var processedData = DataProcessor.Process(data);
var userDecision = DialogService.AskUserAbout(processedData);
// ...
Non voglio bloccare l'interfaccia utente in ogni fase, in modo che ogni metodo non ritorna immediatamente, e genera un evento una volta terminato. Ora ilarità consegue, dal momento che la mutazione del blocco di codice di cui sopra in
DataGetter.Finished += (data) =>
{
DataProcessor.Finished += (processedData) =>
{
DialogService.Finished(userDecision) =>
{
// ....
}
DialogService.AskUserAbout(processedData);
}
DataProcessor.Process(data);
};
DataGetter.GetData();
Questo si legge troppo simile Continuation-passing style per i miei gusti, e ci deve essere un modo migliore per strutturare questo codice. Ma come?
mi fa pensare a compiti di continuazione: http://www.blackwasp.co.uk/ContinuationTasks.aspx –
Questo sarà massicciamente più facile in C# 5 con il 'await'. Quindi sì, la gente si imbatte continuamente in questo e non è abbastanza - abbastanza da renderlo effettivamente nella lingua principale. –