如何生成任务<任务>以解包

Sim*_*mon 8 .net c# task-parallel-library async-await

有人可以解释这两个陈述之间的区别:

Task<Task> bTask = backup.BackupCurrentDatabaseAsync()
    .ContinueWith(_ => CompressArchiveAsync());
//unwrap the tasks to produce one entire task
Task t = bTask.Unwrap();
Run Code Online (Sandbox Code Playgroud)

VS

Task<Task> bTask = backup.BackupCurrentDatabaseAsync()
    .ContinueWith(_ => 
{
    CompressArchiveAsync();
});
//unwrap the tasks to produce one entire task
Task t = bTask.Unwrap();
Run Code Online (Sandbox Code Playgroud)

该方法ExtractArchiveAsync(),BackupCurrentDatabaseAsync(),RestoreDatabaseAsync()全部返回Task.

这里,第一个Continuation返回a Task<Task>.然后我可以Unwrap()将此任务放在结果(内部)任务上.

第二个版本不编译.这里唯一不同的是周围的牙箍CompressArchiveAsync().

我试图访问结果(内部)Task来检查Task.Status.如果我使用第二种方法,Task.Status将报告BackupCurrentDatabaseAsync()任务的结果.

Luc*_*ski 11

.ContinueWith(_ => CompressArchiveAsync());
Run Code Online (Sandbox Code Playgroud)

相当于:

.ContinueWith(_ => 
{
    return CompressArchiveAsync();
});
Run Code Online (Sandbox Code Playgroud)

请注意return.

你的第二个代码片段不能编译,因为ContinueWith它不会返回a Task<Task>,而只是a Task,并且没有任何内容可以解包.

以下是一个Func<Task, Task>(一个带a Task和返回a 的函数Task)

_ => 
{
    return CompressArchiveAsync();
}
Run Code Online (Sandbox Code Playgroud)

但是以下实际上绑定到一个Action<Task>(一个Task但不返回任何东西的函数):

_ => 
{
    CompressArchiveAsync();
}
Run Code Online (Sandbox Code Playgroud)

并且永远不会返回对Task创建者的引用CompressArchiveAsync.如果没有引用它,则无法检查其Task状态.

注意:

因此你ContinueWith(Func<Task, Task>)返回一个Task<Task>你可以解开的东西,但你ContinueWith(Action<Task>)只需返回一个Task.