gpt4 book ai didi

c# - 提取 JSON 并将其存储在数据库中时,使用异步等待功能是否有任何值(value)?

转载 作者:行者123 更新时间:2023-11-29 02:47:44 24 4
gpt4 key购买 nike

我最近开始使用 C# 进行编程(在对 PHP 和 JavaScript 有了一些经验之后),并且我构建了一个简单的控制台程序来下载 JSON 字符串并将某些值存储在数据库中。有问题的数据是大约。 70.000 套(转换成行进入我的数据库)。由于我从 (Quandl) 下载此 JSON 的服务器的限制,建议每个请求下载 100 个数据集,因此我有 700 个请求要发出。

对于每个请求,我都会下载 JSON 字符串,对其进行反序列化并循环遍历 100 次以将相应的值存储在数据库中。我正在使用 WebClient 发出请求,并使用 JSON.net 进行反序列化。

目前,根据我的设置,大约需要。每个请求7秒,包括向数据库中插入数据,大约需要一个半小时完成。

那么问题就变成了;有没有办法用 async/await 方法加快速度?我读到的所有内容更多的是在 UI 方面(即在处理请求时 UI 不会被卡住),但我想知道是否有可能同时启动请求(或者,当时每 10 个请求或其他) .为了完成,我添加了我的代码的净化版本(使其更短但没有删除任何逻辑)。

https://dotnetfiddle.net/S0fnBc

最佳答案

async/await 用于异步操作。异步执行不等于并行执行。异步执行不会阻塞调用者,并行执行允许并发执行。您需要并行执行。为此,您可以使用 Task Parallel Library .还有一个patterns and practices这是一本很棒的书。这是一个简化的实现:

var httpClient = new HttpClient();
httpClient.BaseAddress = new Uri("/path/to/data");

var tasks = new Task<Task<HttpResponseMessage>>[5];

for (var i = 0; i < tasks.Length; i++)
{
tasks[i] = Task<Task<HttpResponseMessage>>.Factory.StartNew(async () => await httpClient.GetAsync("?updatedFilterParams"));
}

Task.WhenAll(tasks); // wait for them to complete

foreach (var task in tasks)
{
var data = task.Result.Result.Content.ReadAsStringAsync();
// do something
}

需要注意的一些事情:WebClient 无法处理并发请求,因此您要么必须为每个请求新建 另一个,要么使用 HttpClient 和我一样。此外,在您的代码和数据之间有很多东西可以并且经常对同一来源的并发请求施加限制,因此您需要限制一次触发的请求数量。

关于c# - 提取 JSON 并将其存储在数据库中时,使用异步等待功能是否有任何值(value)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39781569/

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