2017-10-12 66 views
0

我在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,我发现的所有信息对我来说太过技术化,无法将其视觉化并应用于我的情况。

+0

想知道为什么你使用'WebRequest'而不是'HttpClient' –

+0

它看起来像这个代码发送两次完全相同的请求,所以你应该得到两次完全相同的答案。所以,如果是相同的回应,谁会关心A和B的顺序。任何机构是否真的测试过这些代码?你有一个列表url,但它永远不会用在ForEach中。那么这段代码实际发送了什么消息。 – jdweng

回答

0

也许我想这个毛病,但如果我送2个请求(A & B)和让说乙实际上返回第一,我怎么能保证,当我回到我更新数据库我更新正确的记录?我可以通过API调用发送ID并返回它吗?

你的代码没有包含任何看起来像“ID”的东西,但我认为你需要的所有东西都在URL中。如果是这样的话,一个简单的答案是使用一个字典而不是一个袋子。

List<string> urls = GetListOfUrlsFromSomewhere(); 

    var results = new ConcurrentDictionary<string, OccupationSearch>(); 

    Parallel.ForEach(urls.Distinct(), url => 
    { 
     WebRequest request = WebRequest.Create(url); 

     string response = new StreamReader(request.GetResponse().GetResponseStream()).ReadToEnd(); 

     var result = JsonSerializer().Deserialize<OccupationSearch>(new JsonTextReader(new StringReader(response))); 

     results.TryAdd(url, result); 
    }); 

这个代码完成后,results字典将包含每个响应回原始URL相关条目。

注意:您可能想要使用HttpClient而不是WebClient,并且应该注意处置一次性对象,例如, StreamReader和StringReader。

+0

这不是我的代码,这是来自链接。我实际上使用HTTPClient。此外,我意识到最简单的解决方案只是将我的Foreach循环转换为Parallel.Foreach循环。这样就不会有关于ID等的问题了...... – user3486773