c# - 是否有等效于 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
.
这样的方法存在吗?如果它不存在,我可以创建一个扩展来执行此操作吗?
解决方案
您正在寻找ContinueWith
:
await GetObjectAsync<IEnumerable<Foo>>()
.ContinueWith(task => task.Result.ToList());
但是,这会表现得更糟,并且有一些可能需要一段时间才能理解的复杂性,例如确保您为您的延续代码使用正确的调度程序(为您await
执行此操作)。
如果可读性是一个问题,我宁愿把你的代码分成多行:
var foosEnumerable = await GetObjectAsync<IEnumerable<Foo>>();
var foos = foosEnumerable.ToList();
推荐阅读
- android - 资源 android:attr/dialogCornerRadius
- reactjs - 如何使用 react-router-dom 有条件地渲染路由?
- php - 当用户从 Oracle 在 PHP 应用程序中输入重复的主键时引发应用程序错误
- r - 小标题上的因子和标签
- c++ - 如何在使用 MPI 进行并行编程以使用动态 2D 数组进行矩阵乘法时解决问题?
- c++ - 如何在 OpenGL 中更改视角?
- ruby-on-rails - 在视图中正确转义字符串
- model-view-controller - KendoUI,您可以在 ClientTemplate() 中使用模型中的参数调用 C# 方法吗
- scikit-learn - sklearn.linear_model.LinearRegression 如何在数据不足的情况下工作?
- angular - JSON.stringify 在 Angular Universal 中的 SSR 期间引发错误,但适用于 locahost“TypeError:将循环结构转换为 JSON”