我最近开始使用C#编程(在PHP和JavaScript方面有一定经验之后),并且我构建了一个简单的控制台程序,该程序下载JSON字符串并将某些值存储在数据库中。所讨论的数据约为。70.000集(转换为行到我的数据库中)。由于我从(Quandl)下载此JSON的服务器上的限制,建议每个请求下载100个数据集,因此我有700个请求。
对于每个请求,我都会下载JSON字符串,将其反序列化并循环遍历100次,以将各自的值存储在数据库中。我WebClient
用来发出请求,并利用JSON.net进行反序列化。
目前,有了我的安装程序,大约需要花费时间。每个请求需要7秒钟,包括将数据插入数据库中,大约需要一个半小时才能完成。
问题就变成了;无论如何,有什么用async / await方法来加快它的速度吗?我阅读的内容更多是在UI方面(即,在处理请求时UI不冻结),但是我想知道是否有可能同时(或每10个时间)启动请求。 。为了完成操作,我添加了经过清理的代码版本(使代码缩短了一点,但未删除任何逻辑)。
async/await
用于异步操作。异步执行不等于并行执行。异步执行不会阻塞调用方,而并行执行则允许并发执行。您需要并行执行。为此,您可以使用Task Parallel Library。还有一本关于模式和实践的书,非常值得一读。这是一个简化的实现:
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
像我一样使用。另外,在代码和数据之间有很多事情可以并且经常对同一来源的并发请求施加限制,因此您将希望限制一次触发的请求数量。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句