尝试优化一些代码我最终得到了这种结构:
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();
});
}
答案 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.