De alguna manera no puedo creer que soy el primero en encontrarme con ese problema (y no quiero creer que soy el único lo suficientemente estúpido como para no ver una solución directamente), pero mi búsqueda no era sólida. suficiente.¿Cómo evitar el código de spaghetti cuando se usan eventos de finalización?
Me encuentro con frecuencia en una situación en la que necesito hacer algunos pasos que requieren mucho tiempo, uno después del otro. El flujo de trabajo se parece
var data = DataGetter.GetData();
var processedData = DataProcessor.Process(data);
var userDecision = DialogService.AskUserAbout(processedData);
// ...
no quiero bloquear la interfaz de usuario durante cada paso, por lo que cada método no respondió de inmediato, y provoca un evento, una vez que haya terminado. Ahora se produce hilaridad, ya que muta el bloque de código anterior en
DataGetter.Finished += (data) =>
{
DataProcessor.Finished += (processedData) =>
{
DialogService.Finished(userDecision) =>
{
// ....
}
DialogService.AskUserAbout(processedData);
}
DataProcessor.Process(data);
};
DataGetter.GetData();
Esto lee demasiado a Continuation-passing style para mi gusto, y tiene que haber una mejor manera de estructurar este código. ¿Pero cómo?
me hace pensar en las tareas de continuación: http://www.blackwasp.co.uk/ContinuationTasks.aspx –
Esto será más fácil masivamente en C# 5 con el 'await'. Así que sí, la gente se encuentra con esto todo el tiempo y no es bonita, lo suficiente como para convertirlo en el lenguaje central. –