2017-10-12 65 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