多个await语句

问题描述 投票:0回答:1

我正在尝试“ContinueWith”函数,但最终我不明白它。 在此示例代码中:

var s = Task.FromResult(true).ContinueWith(async t => t ).ContinueWith(async t => t);
await await await await await s;

每个“等待”在等待什么?

c# asynchronous async-await
1个回答
1
投票

你正在做一些奇怪的事情,并且你得到了奇怪的输出。

让我们简单一点:

var s = Task.FromResult(true).ContinueWith(t => t);
await await s;
  • Task.FromResult(true)
    返回
    Task<bool>
  • ContinueWith
    完成时传递
    Task<bool>
    :想法是它可以查询任务以查看它是否成功/失败,并获取其结果。
  • 总体思路是
    ContinueWith
    返回一个值,而不是
    Task
    。但是,您将从它返回
    t
    ,即
    Task<bool>
    ContinueWith
    将该返回值包装在
    Task
    中,其想法是,一旦
    Task
    完成并且延续已运行,
    Task.FromResult(true)
    就会完成。这会给你一个
    Task<Task<bool>>

当您使延续采用

async t => t
时,您就是在告诉编译器生成一个返回
Task<T>
的委托。在本例中,它是一个接受
Task<bool>
并返回
Task<Task<bool>>
的方法。然后延续将其包装在另一个任务中以获得
Task<Task<Task<bool>>>

然后你在第二个延续中执行相同的操作,并获得更多任务。

您可以将其全部梳理清楚并弄清楚每个任务代表什么,但这并没有多大意义:您正在做一些愚蠢的事情,并且得到了愚蠢的结果。

请记住,

ContinueWith
早于异步/等待:你实际上不应该将两者混合使用(事实上,你现在根本不应该使用
ContinueWith
)。

© www.soinside.com 2019 - 2024. All rights reserved.