簡體   English   中英

C#-執行200個http get請求並輸出結果

[英]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));

說明:

  1. 使getSplittedClassName() 異步,以便與其同步獲取所需的東西,然后返回結果,它立即返回Task<> ,當結果可用時將完成。
  2. 我刪除了吞噬所有異常的代碼,因為通常這是一種不好的做法。 如果這里有例外,您應該考慮自己真正想做的事情:您應該重試該請求嗎? 只是讓異常拋出? 忽略這樣的問題通常是一個壞主意。
  3. Task.WhenAll()將返回Task<> ,該Task<>將返回給定任務的所有結果。 您可以同步等待所有這些任務完成,然后將它們全部批量添加到wordList中。 這是線程安全的,因為所有項目都在單個線程上添加到wordList ,而您的原始代碼中有多個線程可能試圖同時向wordList中添加值。

另外,我假設這只是一項家庭作業,但是如果這是實際情況,那么您同時對同一個URL進行200個GET請求,這將是一個很大的危險信號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM