gpt4 book ai didi

c# - 如何生成 Task 以展开

转载 作者:太空狗 更新时间:2023-10-29 18:13:12 28 4
gpt4 key购买 nike

谁能解释一下这两种说法的区别:

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

对比

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

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

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

第二个版本无法编译。这里唯一不同的是 CompressArchiveAsync() 周围的大括号.

我正在尝试访问结果(内部)Task检查 Task.Status .如果我使用第二种方法,Task.Status 会报告 BackupCurrentDatabaseAsync() 的结果任务。

最佳答案

.ContinueWith(_ => CompressArchiveAsync());

相当于:

.ContinueWith(_ => 
{
return CompressArchiveAsync();
});

注意 return .

您的第二个代码片段无法编译,因为 ContinueWith不返回 Task<Task> , 但只是一个 Task , 并且没有任何东西可以打开。

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

_ => 
{
return CompressArchiveAsync();
}

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

_ => 
{
CompressArchiveAsync();
}

以及对 Task 的引用创建者 CompressArchiveAsync永远不会返回。如果不引用它,您将无法检查 Task的状态。

注意:

因此你的 ContinueWith(Func<Task, Task>)返回 Task<Task>你可以打开包装,但是你的 ContinueWith(Action<Task>)简单地返回一个 Task .

关于c# - 如何生成 Task<Task> 以展开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27529946/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com