将嵌套的匿名函数转换为 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();
}
试图优化一些代码我最终得到了这种结构:
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();
}