我在ssis包中有一个c#脚本任务,用于通过我公司的专有系统对数据进行地理编码。它目前的工作原理是这样的:用c#API调用发送和返回变量?
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)和让说乙实际上返回第一,我怎样才能确保当我回去更新我的数据库时,我正在更新正确的记录?我可以通过API调用发送ID并返回它吗?
我的想法是创建一个请求数组,在不等待响应的情况下通过它们进行刻录,并将这些值返回到另一个数组中,然后我将在插入语句中循环。
这是一个很好的方法来解决这个问题吗?我从来没有使用Parrallel.ForEach,我发现的所有信息对我来说太过技术化,无法将其视觉化并应用于我的情况。
想知道为什么你使用'WebRequest'而不是'HttpClient' –
它看起来像这个代码发送两次完全相同的请求,所以你应该得到两次完全相同的答案。所以,如果是相同的回应,谁会关心A和B的顺序。任何机构是否真的测试过这些代码?你有一个列表url,但它永远不会用在ForEach中。那么这段代码实际发送了什么消息。 – jdweng