需要澄清等待任务的方法

本文关键字:任务 方法 等待 | 更新日期: 2023-09-27 18:32:45

var task = Xyz.Start();
task.ContinueWith((ant)=> Validate());
task.Wait();

var task1 = Xyz.Start();
var task2 = task1.ContinueWith((ant)=> Validate());
task2.Wait();

最近我遇到了一个SO问题(对不起,不记得是哪一个),OP的示例代码就像顶部的代码一样。 接受的答案更正了底部的代码,没有任何解释。

那么这两个代码片段之间有什么区别,为什么底部的代码片段是正确的?我认为task1.ContinueWith()实际上是task1.Wait()这意味着在任务 1 返回之前执行不会继续。

需要澄清等待任务的方法

ContinueWith不会等待。它注册要在任务完成时执行的回调。也许您应该查看ContinueWith的文档以更完整地了解这一点。

您需要哪种形式取决于您想要什么。如果只想在继续完成后继续,则需要等待 task2

我认为task1.ContinueWith()实际上是task1.Wait()这意味着在task1返回之前不会继续执行。

不。 ContinueWith()确保仅在Task完成后才开始执行您传递到的委托。但它不会阻止调用它的代码的执行。

好吧,如果我们阅读代码,它相当简单

//Start initial task
Task initTask = Xyz.Start();
//Continue initial task with something
Task continueTask = initTask.ContinueWith((obj)=> { /*work work*/ }); 
//Wait for the initial task to finish (not the continue)
initTask.Wait();
//Wait for the continue task to finish
continueTask.Wait();