【发布时间】:2012-10-28 10:47:13
【问题描述】:
我在 C#、VS2012、WPF 4.5 中有以下代码。
我的期望是,.ContinueWith 将在任务完全完成后执行(这是延续的全部目的,不是吗?)。
这应该导致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 语句上开始了。
这是预期的行为吗?我在这里错过了什么吗?我不能依靠ContinueWith在任务完成后开始吗?
更新:
贾斯汀的回答启发了我检查以下内容:
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。有没有办法可靠地等待包含 awaits 的任务完成?
【问题讨论】:
-
我认为你应该直接调用
Task.Delay——而不是使用await关键字。 -
你会注意到
_实际上是一个Task<Task>,完全支持Justin所说的...... -
其实使用Task.Delay(6)会产生预期的结果,但不会等待6秒。我认为删除整行几乎是一样的。
标签: c# .net wpf task-parallel-library async-await