【发布时间】:2016-12-12 12:34:03
【问题描述】:
我在选择对 Web API 进行异步请求的最佳方式时遇到了一些麻烦。我需要从连续的网络请求中获取数据,满足以下要求:
- 请求显然不能阻塞 GUI(异步或在另一个线程中)
- 每个请求都会返回一个记录列表,我想立即将其与我的应用数据合并
- 请求不能同时运行(保持“逻辑”顺序)
- 如果请求失败,则必须取消剩余的请求
Web 请求不是 CPU 密集型的,只是速度很慢。此外,由于我想在每次请求后合并结果,使用不同的线程会导致一些同步开销。
这就是为什么我认为最好使用 async/await 来避免创建新线程。首先,这个假设正确吗?
我的(不完整的)解决方案:
我使用yield 提出了一个优雅的解决方案,但它没有实现预期的async 行为。
这是简化的 API 连接器代码:
public IEnumerable<Record[]> GetRecordsInRange(DateTime startDate, DateTime endDate)
{
while (startDate <= endDate)
{
List<Record> results = new List<Record>();
try
{
results.AddRange(ExecuteQueryAPI(startDate, QueryTypes.A));
results.AddRange(ExecuteQueryAPI(startDate, QueryTypes.B));
results.AddRange(ExecuteQueryAPI(startDate, QueryTypes.C));
}
catch (Exception ex)
{
// Cancel remaining requests
yield break;
}
// Return partial results.
yield return results.ToArray();
// Jump to the next day.
startDate = startDate.AddDays(1);
}
yield break;
}
用法:
foreach (var records in APIConnector.GetRecordsInRange(DateTime.Now.AddDays(-10), DateTime.Now))
{
Records.AddRange(records);
}
是否可以对之前的代码实现 aync/await 行为,还是应该使用不同的方法?
【问题讨论】:
-
谢谢,我会仔细看看。一个附属问题是:我应该实施这种解决方案,还是有更好的解决方案?
-
也许是这个? stackoverflow.com/q/23295119/993547 使用 Rx。
标签: c# asynchronous async-await yield-return