Jak wykonać ten kod równolegle? Próbowałem wykonać wykonanie w wątkach, ale prośby są nadal wykonywane sekwencyjnie. Jestem nowy w programowaniu równoległym, będę bardzo szczęśliwy z twojej pomocy.

    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;
    }
1
Cyber User 18 marzec 2020, 16:01

2 odpowiedzi

Najlepsza odpowiedź

I Googled i znalazłem te linki 1, 2. Wydaje się, że WebRequest nie może wykonywać żądań równolegle. Również próbowałem wysłać wiele żądań równoległych za pomocą WebRequest i z niektórych powodów WebRequest nie dokonano próśb równolegle.

Ale kiedy użyłem {{ X0}} Class Wills Wills Równolegle. Spróbuj użyć HttpClient zamiast WebRequest jako Microsoft Zaleca.

, więc po pierwsze, powinieneś użyć HttpClient, aby zrobić żądanie internetowe.


Następnie możesz użyć następnego podejścia do pobierania stron równoległych:

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();
}

Oczywiście należy dodać obsługę błędów do tej metody.

2
Iliar Turdushev 19 marzec 2020, 03:59

Proponuję ostrożnie studiować ten post: https://docs.Microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/asadync/winalthrough-accessing-The-web-by- Korzystanie-async-i-a-cennik

Ma samouczek, który wykonuje dokładnie to, co chcesz zrobić: pobieranie wielu stron jednocześnie.

Webroquest nie działa asynchronicznie z GetResponse celowo. Ma drugą metodę: GetResponseasync ().

Aby zdobyć mokry z gwintowaniem, można również użyć wymiany kropli dla foreach i pętli: https://docs.microsoft.com/en-us/dotnet/standard/parlele-programming/how-to-to- pisze-a-prosta-równoległa-pętla

0
John Lord 19 marzec 2020, 03:56