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<TResult>(Func<Task, TResult>) 返回一个 Task<TResult>ContinueWith(Action<Task>)返回一个Task.因此你ContinueWith(Func<Task, Task>)返回一个Task<Task>你可以解开的东西,但你ContinueWith(Action<Task>)只需返回一个Task.
| 归档时间: |
|
| 查看次数: |
1294 次 |
| 最近记录: |