Почему-то я не могу поверить, что я первый столкнулся с этой проблемой (и я не хочу верить, что я единственный, кто достаточно глуп, чтобы не видеть решения напрямую), но мой поиск-фу не был достаточно сильный.
Я регулярно сталкиваюсь с ситуацией, когда мне нужно выполнить несколько трудоемких шагов один за другим. Рабочий процесс выглядит как
var data = DataGetter.GetData();
var processedData = DataProcessor.Process(data);
var userDecision = DialogService.AskUserAbout(processedData);
// ...
Я не хочу блокировать пользовательский интерфейс во время каждого шага, поэтому каждый метод возвращается немедленно и вызывает событие после его завершения. Теперь начинается веселье, так как вышеуказанный кодовый блок видоизменяется в
DataGetter.Finished += (data) =>
{
DataProcessor.Finished += (processedData) =>
{
DialogService.Finished(userDecision) =>
{
// ....
}
DialogService.AskUserAbout(processedData);
}
DataProcessor.Process(data);
};
DataGetter.GetData();
Это выглядит слишком похоже на Стиль передачи продолжения на мой вкус, и должен быть лучший способ структурировать этот код. Но как?