假设我有两个创建Task对象的独立异步函数(我无法控制):
Task A(); Task B();
和其他一些非异步功能
void X();
如何构建一个单独的任务链,按顺序执行所有这些,并允许附加继续(将在X之后执行)?
如果我这样做:
Task Sequential() { return A() .ContinueWith(t => { B(); }) .ContinueWith(t => { X(); }); }
这不起作用,因为B将启动一个新的任务链.如果B需要很长时间才能完成,则首先执行X(以及在返回的Task上,Sequential的调用者可能会继续执行任何其他操作).我需要X作为单个任务链中的最后一个元素,以B任务为先例.
如果我这样做:
Task Sequential() { return A() .ContinueWith(t => { B().ContinueWith(t => { X(); }); }); }
这只能部分解决问题,因为即使A,B和X现在按顺序执行,如果调用者执行Sequential().ContinueWith,该延续将并行执行到B和X,而不是X.
解决方法
有没有理由不使用等待?例如,
async Task Sequential() { await A(); await B(); X(); }