将嵌套的匿名函数转换为 foreach 循环

Translate nested anonymous functions to foreach loop

试图优化一些代码我最终得到了这种结构:

StaticMethod(propA, () => 
{
    StaticMethod(propB, () => 
    {
        StaticMethod(propC, () => 
        {
            // Write line in console here to say it's done.
        });
    });
});

我在想也许应该有一种方法可以将其简化为一些 foreach 甚至是一个简单的 for 循环,像这样:

foreach (var prop in props) // consider that `props` can be iterated over
{
    // Here I don't know how to chain everything...
}

这可行吗?我需要修改 StaticMethod 才能实现吗?单独使用循环可能不够,但是将示例扩展到 1000 个嵌套函数,我需要一些迭代。

这里是StaticMethod的概念:

static void StaticMethod(Prop prop, Action done) 
{
    // Some code here
    someDispatcher.BeginInvoke(() => {
        // More code here
        done();
    });
}

这确实是一个基于回调的异步模型极其困难的问题。如果将 StaticMethod 转换为基于 Task 的异步模型,那么解决方案会变得 简单。如果 StaticMethod 是您自己的方法,理想情况下,您只需完全使用基于 Task 的模型重写它,完成后 returns 一个 Task,而不是而不是采用回调,但如果这不是您的方法,并且您无法更改它,则可以创建一个使用基于 Task 的模型的包装器。要将基于回调的方法转换为基于 Task 的方法,您只需使用 TaskCompletionSource:

public static Task StaticMethodAsync(object a)
{
    var tcs = new TaskCompletionSource<bool>();
    StaticMethod(a, () => tcs.SetResult(true));
    return tcs.Task;
}

现在我们可以编写一个 async 方法来遍历 props 并依次调用每个异步方法:

foreach (var prop in props)
{
    await StaticMethodAsync(prop);
}
// Write line in console here to say it's done.

如果您真的想在维护回调模型的同时解决这个问题,您可以,但是,正如您在下面看到的,阅读、理解和逐步完成要困难得多:

public static void Foo(object[] props, Action callback)
{
    int i = -1;
    Action innerCallback = null;
    innerCallback = () =>
    {
        i++;
        if (i < props.Length)
        {
            StaticMethod(props[i], innerCallback);
        }
        else
        {
            callback();
        }
    };
    innerCallback();
}