首页 > 解决方案 > 是否有等效于 async 关键字的方法?

问题描述

有时,我想对异步方法的结果做一些事情,例如:

var foos = (await GetObjectAsync<IEnumerable<Foo>>()).ToList();

但是由于括号的原因,这个符号很难阅读。如果我用结果调用另一个异步方法,await则会嵌套多个表达式,例如:

var result = (await (await GetObjectAsync<IEnumerable<Foo>>()).First().SomeMethodAsync()).GetResult();

我想写一个更流畅的等价物:

var foos = GetObjectAsync<IEnumerable<Foo>>()
    .Async()
    .First()
    .SomeMethodAsync()
    .Async()
    .GetResult();

我阅读了文档,但唯一具有正确签名的东西(除非我遗漏了什么)是Result,并且Result不是我想要的,因为它不等同于await.

这样的方法存在吗?如果它不存在,我可以创建一个扩展来执行此操作吗?

标签: c#async-await

解决方案


您正在寻找ContinueWith

await GetObjectAsync<IEnumerable<Foo>>()
    .ContinueWith(task => task.Result.ToList());

但是,这会表现得更糟,并且有一些可能需要一段时间才能理解的复杂性,例如确保您为您的延续代码使用正确的调度程序(为您await执行此操作)。

如果可读性是一个问题,我宁愿把你的代码分成多行:

var foosEnumerable = await GetObjectAsync<IEnumerable<Foo>>();
var foos = foosEnumerable.ToList();

推荐阅读