[英]C# - executing 200 http get requests and output the results
我有一個控制台應用程序,用戶在其中輸入菜單選項(1-5),執行某些功能並輸出結果。
功能之一是對某個url執行200個http get請求,取回所有結果,對它們進行一些處理,然后輸出給用戶。
這是我當前的代碼:
Parallel.For(0, 200, i =>
{
String[] words = webApi.getSplittedClassName();
for (int j = 0; j < words.Length; j++)
{
wordsList.Add(words[j]);
}
});
和getSplittedClassName :
public string[] getSplittedClassName()
{
HttpResponseMessage response = null;
try
{
response = httpClient.GetAsync(url).Result;
}
catch (WebException e)
{
return null;
}
return parser.breakdownClassName(response);
}
現在,由於用戶輸入了一個選項號,該程序執行了所需的功能,然后我將輸出放了進去,我認為沒有必要以異步方式完成http工作,因此所有工作都是同步的。
問題是,大約30到40秒的時間來完成請求是很有意義的嗎?
基本上有3個功能:執行1個請求,執行3個請求和200個請求。
做200個請求並等待所有結果的最佳選擇是什么? 就像我只發出一個請求時一樣嗎?
謝謝
Parallel.For()
傾向於假定您的操作主要是受CPU限制的,因此它將使用一定程度的並行度,該並行度已調整為計算機具有多少個CPU內核。 但是HTTP請求往往是受IO限制的,因此您的大部分時間都花在等待目標計算機將信息發送回給您上。
這意味着這是使用異步處理的好機會。 嘗試這樣的事情:
public async Task<string[]> getSplittedClassName()
{
HttpResponseMessage response = await httpClient.GetAsync(url);
return parser.breakdownClassName(response);
}
和這個:
var classNameTasks = Enumerable.Range(1, 200)
.Select(i => webApi.getSplittedClassName())
.ToArray();
wordList.AddRange(
Task.WhenAll(classNameTasks).Result
.SelectMany(g => g));
說明:
getSplittedClassName()
異步,以便與其同步獲取所需的東西,然后返回結果,它立即返回Task<>
,當結果可用時將完成。 Task.WhenAll()
將返回Task<>
,該Task<>
將返回給定任務的所有結果。 您可以同步等待所有這些任務完成,然后將它們全部批量添加到wordList
中。 這是線程安全的,因為所有項目都在單個線程上添加到wordList
,而您的原始代碼中有多個線程可能試圖同時向wordList
中添加值。 另外,我假設這只是一項家庭作業,但是如果這是實際情況,那么您同時對同一個URL進行200個GET請求,這將是一個很大的危險信號。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.