C# 。继续在任务完成之前开始
我在C#,VS2012,WPF 4.5中有以下代码。 我的期望是,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
.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);
});
}