gpt4 book ai didi

c# - 对 API 的异步请求,使用 yield 迭代器?

转载 作者:太空宇宙 更新时间:2023-11-03 15:11:16 25 4
gpt4 key购买 nike

我在选择向 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 行为,或者我应该使用不同的方法?

最佳答案

async-await 在您的情况下是足够好的方法。
这种方法将只使用一个线程,不会阻塞 UI。

public async Task<IEnumerable<Record>> GetRecordsInRange(DateTime startDate, 
DateTime endDate)
{
while (startDate <= endDate)
{
List<Record> results = new List<Record>();
// send requests in order you want
var taskA = ExecuteQueryAPIAsync(startDate, QueryTypes.A);
var taskB = ExecuteQueryAPIAsync(startDate, QueryTypes.B);
var taskC = ExecuteQueryAPIAsync(startDate, QueryTypes.C);

// observes results in same order
var resultA = await taskA;
results.AddRange(resultA);

var resultB = await taskB;
results.AddRange(resultB);

var resultC = await taskC;
results.AddRange(resultC);

// Jump to the next day.
startDate = startDate.AddDays(1);
}

return results;
}

您需要创建 ExecuteQueryAPIAsync 方法来异步获取响应。

await taskA 关键字将返回结果集合或抛出异常。

关于c# - 对 API 的异步请求,使用 yield 迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41101066/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com