C# 。继续在任务完成之前开始

C# 。继续在任务完成之前开始,c#,.net,wpf,task-parallel-library,async-await,C#,.net,Wpf,Task Parallel Library,Async Await,我在C#,VS2012,WPF 4.5中有以下代码。 我的期望是,.ContinueWith将在任务完全完成后执行(这是continuence的全部目的,不是吗?) 这将导致finalResult中的值为2 int myTestInt = 0; Task task = Task.Factory.StartNew(async () => { myTestInt = 1; await Task.Delay(TimeSpan.FromSeconds(6)); myTestIn

我在C#,VS2012,WPF 4.5中有以下代码。 我的期望是,
.ContinueWith
将在任务完全完成后执行(这是continuence的全部目的,不是吗?)

这将导致
finalResult
中的值为2

int myTestInt = 0;

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

}).ContinueWith(_ =>
   {
      int finalResult = myTestInt;
   });
事实上,
finalResult
被赋值为1。因此,似乎已经在
await
语句上启动了延续

这是故意的行为吗?我是不是遗漏了什么?任务完成后,我不能依靠
继续
启动吗

更新:

贾斯汀的回答激励我检查以下内容:

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

task.Wait();
int result2 = myTestInt;

finalResult仍然设置为1。是否无法可靠地等待包含
wait
s的任务完成?

wait将立即将控制权返回到调用函数,在这种情况下,调用函数是任务的新开始。这意味着任务将完成并执行ContinueWith。
如果您确实希望任务在ContinueWith之前完成,则不要等待任务。延迟。

当您将
async
委托传递给
task.Factory.StartNew
时,返回的
任务
仅代表该委托的第一部分(直到
等待
时,它是尚未完成的部分)

但是,如果将
async
委托传递给新的
Task.Run
方法(出于此原因包括该方法),则返回的
Task
代表整个委托。因此,您可以按预期使用
ContinueWith
。(尽管
wait
通常比
ContinueWith
更好)

有关
StartNew
Run
的更多信息,请参阅。

我在MSDN中看到了这一点::-)


所以不要忘记“async()

我认为你应该直接调用
Task.Delay
,而不是使用
wait
关键字。你会注意到
\uu
实际上是一个
Task
,它完全支持Justin所说的……事实上,使用Task.Delay(6)会产生预期的结果,但不会等待6秒。我认为删除整行也是一样的。我认为你是对的-等待将当前任务标记为已完成。虽然它不是(至少从语义的角度来看不是)。由于await是当今所有软件的基本构建块,这意味着永远不再依赖ContinueWith。你不认为这是一个bug吗?他的代码有
async
他的问题是他使用的
TaskFactory
没有重载来接收
Func
Func
任务。Run
没有重载。
public async  void button1_Click(object sender, EventArgs e)
{
    pictureBox1.Image = await Task.Run(async() =>
    {
        using(Bitmap bmp1 = await DownloadFirstImageAsync())
        using(Bitmap bmp2 = await DownloadSecondImageAsync())
        return Mashup(bmp1, bmp2);
    });
}