当提取JSON并将其存储在数据库中时,使用async await功能是否有任何价值?

本文关键字:功能 await async 使用 是否 任何价 JSON 提取 存储 数据库 | 更新日期: 2023-09-27 18:09:30

我最近开始用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

当提取JSON并将其存储在数据库中时,使用async await功能是否有任何价值?

async/await用于异步操作。异步执行不等于并行执行。异步执行不会阻塞调用者,并行执行允许并发执行。你需要并行执行。为此,您可以使用任务并行库。还有一本很好的模式和实践书。下面是一个简化的实现:

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不能并发请求,所以你要么必须为每个请求添加另一个new,要么像我一样使用HttpClient。此外,在代码和数据之间有许多东西可能并且经常对同一来源的并发请求施加限制,因此您需要限制一次发出的请求数量。