【发布时间】:2017-10-12 22:51:25
【问题描述】:
我在 ssis 包中有一个 c# 脚本任务,旨在通过我公司的专有系统对数据进行地理编码。它目前的工作方式如下:
1) 拉取地址查询并放入数据表 2) 遍历该表和 Foreach 行,构建请求,发送请求,等待响应,然后插入回数据库。
问题是每次调用都需要永远返回,因为在 api 端获取新地址之前,它会检查当前数据库(字符串匹配)以确保该地址不存在。如果不存在,那就出去从谷歌之类的服务中获取新数据。
因为我一次只做一个,所以当我回去插入数据库时,很容易将 ID 字段与记录一起保存。
现在问题来了...有人告诉我将其配置为多线程或异步。这是我在此处阅读的有关此主题的页面: ASP.NET Multithreading Web Requests
var urls = new List<string>();
var results = new ConcurrentBag<OccupationSearch>();
Parallel.ForEach(urls, url =>
{
WebRequest request = WebRequest.Create(requestUrl);
string response = new StreamReader(request.GetResponse().GetResponseStream()).ReadToEnd();
var result = JsonSerializer().Deserialize<OccupationSearch>(new JsonTextReader(new StringReader(response)));
results.Add(result);
});
也许我在想这个错误,但是如果我发送 2 个请求(A 和 B)并假设 B 实际上首先返回,我如何确保当我回去更新我的数据库时我正在更新正确的记录?我可以通过 API 调用发送 ID 并返回吗?
我的想法是创建一个请求数组,在不等待响应的情况下处理它们并将这些值返回到另一个数组中,然后我将在我的插入语句中循环。
这是解决这个问题的好方法吗?我从未使用过 Parrallel.ForEach,而且我在其中找到的所有信息都过于技术化,无法想象并适用于我的情况。
【问题讨论】:
-
想知道你为什么使用
WebRequest而不是HttpClient -
看起来这段代码两次发送完全相同的请求,所以你应该两次得到完全相同的答案。所以谁在乎如果它是相同的响应返回什么订单 A 和 B。有没有人实际测试过这段代码?您有一个列表 url,但它从未在 ForEach 中使用。那么这段代码实际发送了什么消息。
标签: c# asynchronous httpwebrequest httpwebresponse