【发布时间】:2021-11-16 20:00:08
【问题描述】:
我正在从某种 Products API 请求数据,但问题是我得到了 20 x 20 的数据。所以端点看起来像这样:
https://www.someDummyAPI.com/Api/Products?offset=0&count=20
注意:我无法更改计数,它将始终为 20。
即来自该端点的数据将包含 20 条记录,从 0 到 20,之后我必须将偏移量增加 20 才能获得下 20 条记录,依此类推(总共大约 1500 条记录,所以我必须发出大约 700 条请求)。
获取所有数据后,我使用存储过程将其插入 SQL 数据库(这是不同的过程)。
所以我的问题是,如何加快获取过程,我考虑过并行运行任务,但我需要从响应中获取结果。
现在这个过程看起来像这样:
protected async void FSL_Sync_btn_Click(object sender, EventArgs e)
{
int offset = 0;
int total= 0;
bool isFirst = true;
DataTable resTbl = CreateDt();
while (offset < total || offset == 0)
{
try
{
var data = await GetFSLData(offset.ToString(),"Products");
JObject Jresult = JObject.Parse(data);
if (isFirst)
{
Int32.TryParse(Jresult.SelectToken("total").ToString(),out total);
isFirst = false;
}
// Function to chain up data in DataTable
resTbl = WriteInDataTable(resTbl, Jresult);
offset += 20;
}
catch(Exception ex)
{
var msg = ex.Message;
}
}
}
所以我采取的流程是:
- 从 API 获取数据(比如说前 20 条记录)。
- 使用
WriteInDataTable函数添加两个现有的DataTable。 - 从
resTblDatatable将数据插入 SQL 数据库(完全不同的过程,此屏幕截图中未显示)。
我还没有使用并行任务(甚至不知道它是否是一个正确的解决方案),所以非常感谢任何帮助。
【问题讨论】:
-
所以我去复制和粘贴你的代码来修改和回答你的问题......结果很好不是吗?
-
1.测量,2。查明你的瓶颈,然后去看看如何解决它们。
-
让我感到刺痛的第一件事是,在请求下一批之前,您正在等待数据库写入完成。您可以将其分开并加快处理速度。多少取决于您的数据库/连接速度。
-
快速的解决方案是与数据库而不是 HTTP API 进行实际对话。如果您不能这样做,请让 DBA 将数据导出为您可以导入的 CSV。如果您不能这样做,请让服务开发人员在后台准备该 CSV 文件,以便您稍后下载。仅当您别无选择时,才尝试一次下载第 20 行。您在往返中浪费了 80% 的时间,甚至更多时间并浪费了服务器的 CPU。如果他们只是导出一个 CSV 文件,对每个参与的人来说都会便宜很多。 1500 条记录根本没有数据
标签: c# asp.net async-await parallel-processing httprequest