考虑该方法返回一系列任务的情况,例如这样(我主要与.NET 3.5一起工作,因此示例使用CONTUM与await
相同,但问题是相同的。(:
static Task UnwrappedTask()
{
Task<Task> t = TestStr().ContinueWith( (
return GetTaskFromString(s).ContinueWith(
// returns a task
});
});
return t.Unwrap();
}
static async Task GetTaskFromString(string str)
{
await Task.Delay(3000);
}
static async Task<string> TestStr()
{
await Task.Delay(3000);
return "res";
}
每当我们从ContinueWith()
返回时,是否会创建一个新的任务对象,还是编译器以某种方式重复使用该实例?我对价值类型的任务感兴趣。在这种情况下,星期表现:它是复制了所有这些时间,还是包装器任务类提供了一种有效的方式将其运输到最外面的方法?
ContinueWith
Will 始终创建一个新任务。它不可能做其他事情。该方法的整个设计是ContinueWith
采用现有的Task
,在完成后执行一些任意方法,并产生新的结果。ContinueWith
的结果永远不会与延续的任务相同,因此不能仅仅重新使用它。通过设计,不是突变 它添加一个延续的任务(至少以任何外部可见的方式,从技术上讲,从技术上讲,将持续点燃是任务的内部突变(。