Как выполнять веб-запросы параллельно? - PullRequest
1 голос
/ 18 марта 2020

Как выполнить этот код параллельно? Я пытался выполнить выполнение в потоках, но запросы все еще выполняются последовательно. Я новичок в параллельном программировании, буду очень рад за вашу помощь.

    public async Task<IList<AdModel>> LocalBitcoins_buy(int page_number)
    {
        IList<AdModel> Buy_ads = new List<AdModel>();
        string next_page_url;
        string url = "https://localbitcoins.net/buy-bitcoins-online/.json?page=" + page_number;
        WebRequest request = WebRequest.Create(url);
        request.Method = "GET";
        using (WebResponse response = await request.GetResponseAsync())
        {
            using (var reader = new StreamReader(response.GetResponseStream()))
            {
                JObject json = JObject.Parse(await reader.ReadToEndAsync());
                next_page_url = (string) json["pagination"]["next"];
                int counter = (int) json["data"]["ad_count"];
                for (int ad_list_index = 0; ad_list_index < counter; ad_list_index++)
                {
                    AdModel save = new AdModel();
                    save.Seller = (string) json["data"]["ad_list"][ad_list_index]["data"]["profile"]["username"];
                    save.Give = (string) json["data"]["ad_list"][ad_list_index]["data"]["currency"];
                    save.Get = "BTC";
                    save.Limits = (string) json["data"]["ad_list"][ad_list_index]["data"]["first_time_limit_btc"];
                    save.Deals = (string) json["data"]["ad_list"][ad_list_index]["data"]["profile"]["trade_count"];
                    save.Reviews = (string) json["data"]["ad_list"][ad_list_index]["data"]["profile"]["feedback_score"];
                    save.PaymentWindow = (string) json["data"]["ad_list"][ad_list_index]["data"]["payment_window_minutes"];
                    Buy_ads.Add(save);
                }
            }
        }
        Console.WriteLine(page_number);
        return Buy_ads;
    }

Ответы [ 2 ]

2 голосов
/ 18 марта 2020

Я гуглил и нашел эти ссылки 1 , 2 . Кажется, что WebRequest не может выполнять запросы параллельно. Также я пытался отправлять несколько запросов параллельно, используя WebRequest, и по некоторым причинам WebRequest не делал запросы параллельно.

Но когда я использовал класс HttpClient, он делал запросы параллельно. Попробуйте использовать HttpClient вместо WebRequest, поскольку Microsoft рекомендует .

Итак, во-первых, вы должны использовать HttpClient для отправки веб-запроса.


Затем вы можете использовать следующий подход для параллельной загрузки страниц:

public static IList<AdModel> DownloadAllPages()
{
    int[] pageNumbers = getPageNumbers();
    // Array of tasks that download data from the pages.
    Task<IList<AdModel>>[] tasks = new Task<IList<AdModel>>[pageNumbers.Length];

    // This loop lauches download tasks in parallel.
    for (int i = 0; i < pageNumbers.Length; i++)
    {
        // Launch download task without waiting for its completion.
        tasks[i] = LocalBitcoins_buy(pageNumbers[i]);
    }

    // Wait for all tasks to complete.
    Task.WaitAll(tasks);

    // Combine results from all tasks into a common list.
    return tasks.SelectMany(t => t.Result).ToList();
}

Конечно, вы должны добавить обработку ошибок в этот метод.

0 голосов
/ 19 марта 2020

Я предлагаю вам внимательно изучить этот пост: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/walkthrough-accessing-the-web-by-using-async-and-await

В нем есть учебник, который делает именно то, что вы хотите: Загрузка нескольких страниц одновременно.

WebRequest не работает асинхронно с getResponse целенаправленно. У него есть второй метод: getResponseAsyn c ().

Чтобы намочить пальцы в потоке, вы также можете использовать вставную замену для foreach и для циклов: https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/how-to-write-a-simple-parallel-foreach-loop

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...