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

时间:2016-12-22 19:03:23

标签: c# nested anonymous-function simplify

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

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();
    });
}

1 个答案:

答案 0 :(得分:4)

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

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

现在我们已经可以编写一个迭代async的{​​{1}}方法并依次调用每个异步方法:

props

如果确实希望在维护回调模型时解决此问题,那么可以,但正如您在下面所看到的,它更难阅读,理解,并逐步完成:

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