首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何生成要打开的Task<Task>

如何生成要打开的Task<Task>
EN

Stack Overflow用户
提问于 2014-12-17 16:13:59
回答 4查看 1.9K关注 0票数 8

请有人解释一下这两种说法之间的区别:

代码语言:javascript
复制
Task<Task> bTask = backup.BackupCurrentDatabaseAsync()
    .ContinueWith(_ => CompressArchiveAsync());
//unwrap the tasks to produce one entire task
Task t = bTask.Unwrap();

vs

代码语言:javascript
复制
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()任务的结果。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-12-17 16:18:56

代码语言:javascript
复制
.ContinueWith(_ => CompressArchiveAsync());

相当于:

代码语言:javascript
复制
.ContinueWith(_ => 
{
    return CompressArchiveAsync();
});

注意return

您的第二个代码段没有编译,因为ContinueWith不返回Task<Task>,而只是返回一个Task,所以没有什么可打开的。

下面的内容绑定到Func<Task, Task> (一个接受Task并返回Task的函数)

代码语言:javascript
复制
_ => 
{
    return CompressArchiveAsync();
}

但是,以下内容实际上绑定到Action<Task> (一个接受Task但不返回任何内容的函数):

代码语言:javascript
复制
_ => 
{
    CompressArchiveAsync();
}

并且永远不会返回对由Task创建的CompressArchiveAsync的引用。如果没有引用,您就无法检查Task的状态。

请注意:

  • ContinueWith(Func)返回一个Task<TResult>
  • ContinueWith(Action)返回一个Task

因此,ContinueWith(Func<Task, Task>)返回一个可以展开的Task<Task>,但是ContinueWith(Action<Task>)只返回一个Task

票数 11
EN

Stack Overflow用户

发布于 2014-12-17 16:18:48

不同之处在于Lambda表达式语法。

有两种类型的Lambdas:表达式、Lambdas、语句Lambdas。表达式Lambdas没有大括号,返回表达式的结果,而语句Lambdas的大括号包含零或多个语句(其中一个可以是return语句)。

所以这个表达式Lambda:

代码语言:javascript
复制
_ => CompressArchiveAsync()

相当于此声明Lambda:

代码语言:javascript
复制
_ => { return CompressArchiveAsync(); }

因此,区别在于,在第一个延续中,您返回的是一个任务,而在第二个不返回的过程中,它只是一个无效的匿名委托。这就是为什么第一个延续是一个Task<Task>,而第二个只是一个Task

票数 3
EN

Stack Overflow用户

发布于 2014-12-17 16:34:25

长注释显示4.5代码。

如果您可以迁移到.Net 4.5,而不是您想要编写的代码,那么可以用异步/等待的更紧凑的方式重写这些代码,这实际上是在内部实现所有这些代码:

代码语言:javascript
复制
 async Task CompleteBackup()
 {
    await backup.BackupCurrentDatabaseAsync()
    await CompressArchiveAsync());
    await .....
 }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27529946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档