请有人解释一下这两种说法之间的区别:
Task<Task> bTask = backup.BackupCurrentDatabaseAsync()
.ContinueWith(_ => CompressArchiveAsync());
//unwrap the tasks to produce one entire task
Task t = bTask.Unwrap();vs
Task<Task> bTask = backup.BackupCurrentDatabaseAsync()
.ContinueWith(_ =>
{
CompressArchiveAsync();
});
//unwrap the tasks to produce one entire task
Task t = bTask.Unwrap();方法ExtractArchiveAsync()、BackupCurrentDatabaseAsync()、RestoreDatabaseAsync()都返回Task。
在这里,第一个延续返回一个Task<Task>。然后,我可以Unwrap()这个任务来对结果(内部)任务进行延拓。
第二个版本不编译。这里唯一不同的是CompressArchiveAsync()周围的大括号。
我正在尝试访问结果(内部) Task来检查Task.Status。如果使用第二种方法,Task.Status将报告BackupCurrentDatabaseAsync()任务的结果。
发布于 2014-12-17 16:18:56
.ContinueWith(_ => CompressArchiveAsync());相当于:
.ContinueWith(_ =>
{
return CompressArchiveAsync();
});注意return。
您的第二个代码段没有编译,因为ContinueWith不返回Task<Task>,而只是返回一个Task,所以没有什么可打开的。
下面的内容绑定到Func<Task, Task> (一个接受Task并返回Task的函数)
_ =>
{
return CompressArchiveAsync();
}但是,以下内容实际上绑定到Action<Task> (一个接受Task但不返回任何内容的函数):
_ =>
{
CompressArchiveAsync();
}并且永远不会返回对由Task创建的CompressArchiveAsync的引用。如果没有引用,您就无法检查Task的状态。
请注意:
ContinueWith(Func)返回一个Task<TResult>ContinueWith(Action)返回一个Task。因此,ContinueWith(Func<Task, Task>)返回一个可以展开的Task<Task>,但是ContinueWith(Action<Task>)只返回一个Task。
发布于 2014-12-17 16:18:48
不同之处在于Lambda表达式语法。
有两种类型的Lambdas:表达式、Lambdas、和语句Lambdas。表达式Lambdas没有大括号,返回表达式的结果,而语句Lambdas的大括号包含零或多个语句(其中一个可以是return语句)。
所以这个表达式Lambda:
_ => CompressArchiveAsync()相当于此声明Lambda:
_ => { return CompressArchiveAsync(); }因此,区别在于,在第一个延续中,您返回的是一个任务,而在第二个不返回的过程中,它只是一个无效的匿名委托。这就是为什么第一个延续是一个Task<Task>,而第二个只是一个Task。
发布于 2014-12-17 16:34:25
长注释显示4.5代码。
如果您可以迁移到.Net 4.5,而不是您想要编写的代码,那么可以用异步/等待的更紧凑的方式重写这些代码,这实际上是在内部实现所有这些代码:
async Task CompleteBackup()
{
await backup.BackupCurrentDatabaseAsync()
await CompressArchiveAsync());
await .....
}https://stackoverflow.com/questions/27529946
复制相似问题