假设我有两个独立的异步函数(我不控制)来创建任务对象:
Task A();
Task B();
以及其他一些非异步函数
void X();
如何构建一个按顺序执行所有这些任务并允许附加进一步的延续(将在 X 之后执行)的单个任务链?
如果我这样做:
Task Sequential()
{
return A()
.ContinueWith(t => { B(); })
.ContinueWith(t => { X(); });
}
这不起作用,因为 B 将启动一个新的任务链。如果 B 需要很长时间才能完成,则 X 将首先执行(以及 Sequential 的调用者可能在返回的 Task 上继续执行的任何其他操作)。我需要 X 成为单个任务链中的最后一个元素,并将 B 任务作为其先例。
如果我这样做:
Task Sequential()
{
return A()
.ContinueWith(t => { B().ContinueWith(t => { X(); }); });
}
这只能部分解决问题,因为即使 A、B 和 X 现在将按顺序执行,但如果调用者执行 Sequential().ContinueWith,则该延续将与 B 和 X 并行执行,而不是在 X 之后执行。
有什么理由不使用await吗?例如,
async Task Sequential()
{
await A();
await B();
X();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)