.继续在任务完成之前开始

Fra*_*ald 9 .net c# wpf task-parallel-library async-await

我在C#,VS2012,WPF 4.5中有以下代码.我的期望是,.ContinueWith将在任务完成后执行(这是一个延续的完整目的,不是吗?).

这应该导致值为2英寸finalResult.

int myTestInt = 0;

Task task = Task.Factory.StartNew(async () =>
{
   myTestInt = 1;
   await Task.Delay(TimeSpan.FromSeconds(6));
   myTestInt = 2;

}).ContinueWith(_ =>
   {
      int finalResult = myTestInt;
   });
Run Code Online (Sandbox Code Playgroud)

实际上,finalResult被赋值为1.所以似乎await已经在声明中开始了延续.

这是预期的行为吗?我在这里错过了什么吗?ContinueWith任务完成后我不能依靠启动吗?

更新:

Justin的回答激发了我检查以下内容:

int myTestInt = 0;
Task task=Task.Factory.StartNew(async () =>
{
   myTestInt = 1;
   await Task.Delay(TimeSpan.FromSeconds(6));
   myTestInt = 2;
});

task.Wait();
int result2 = myTestInt;
Run Code Online (Sandbox Code Playgroud)

finalResult仍设置为1.是否无法可靠地等待包含awaits 的任务完成?

Ste*_*ary 10

传递async委托时Task.Factory.StartNew,返回Task仅表示该委托的第一部分(直到它await尚未完成的时间).

但是,如果将async委托传递给新Task.Run方法(由于此原因而包含该方法),则返回Task表示整个委托.所以你可以ContinueWith按照你的期望使用.(虽然await通常是比较好的选择ContinueWith).

有关StartNewvs的更多信息Run,请参阅Stephen Toub关于该主题的帖子.