我正在尝试“ContinueWith”函数,但最终我不明白它。 在此示例代码中:
var s = Task.FromResult(true).ContinueWith(async t => t ).ContinueWith(async t => t);
await await await await await s;
每个“等待”在等待什么?
你正在做一些奇怪的事情,并且你得到了奇怪的输出。
让我们简单一点:
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
)。