使用完成事件时如何避免意大利面条代码?

Jen*_*ens 14 c# events coding-style

不知怎的,我无法相信我是第一个遇到这个问题的人(而且我不想相信我是唯一一个不能直接看到解决方案的傻瓜),但我的搜索功能还不够强大.

当我需要一个接一个地执行一些耗时的步骤时,我经常遇到这种情况.工作流程看起来像

var data = DataGetter.GetData();
var processedData = DataProcessor.Process(data);
var userDecision = DialogService.AskUserAbout(processedData);
// ...
Run Code Online (Sandbox Code Playgroud)

我不希望在每个步骤中阻止UI,因此每个方法都会立即返回,并在完成后引发一个事件.现在欢闹随之而来,因为上面的代码块变异了

DataGetter.Finished += (data) =>
    {
        DataProcessor.Finished += (processedData) =>
        {
            DialogService.Finished(userDecision) =>
                {
                    // ....
                }
                DialogService.AskUserAbout(processedData);
            }
        DataProcessor.Process(data);
    };
DataGetter.GetData();
Run Code Online (Sandbox Code Playgroud)

这听起来像是我的品味延续传递风格,并且必须有更好的方法来构造这个代码.但是怎么样?

Dan*_*rth 7

正确的方法是以同步方式设计组件并在后台线程中执行完整的链.