如何整齐地包装异步方法的结果对象?

时间:2019-11-21 08:32:15

标签: c# async-await

我有一个异步方法,该方法在查询cosmos db容器后给我IEnumerable<T>

var count = (await myContainer.QueryAsync<int>(myQuery)).FirstOrDefault();

是否有一种(更整洁的)方式从该异步方法获取第一项,而没有整个放在括号中?像下面这样?

var count = myContainer.QueryAsync<int>(myQuery).Await().FirstOrDefault();

我严格地don't want to use the GetAwaiter()

2 个答案:

答案 0 :(得分:2)

使用以下扩展方法:

public async static Task<T> FirstOrDefaultAsync<T>(this Task<IEnumerable<T>> taskCollection) {
    return (await taskCollection).FirstOrDefault();
}

您可以减少打扫电话

var count = await myContainer.QueryAsync<int>(myQuery).FirstOrDefaultAsync();

但这并不是使“用括号括起来的东西”消失。

答案 1 :(得分:1)

var result = await myContainer.QueryAsync<int>(myQuery);
var count = result.FirstOrDefault();

整洁。

没有无阻塞的方法可以省略await(除了GetAwaiter()很难看),您不能将其包装在扩展方法中,因为它也必须返回Task<IEnumerable<int>>。最好的办法是将代码分成两个语句,使代码可读。