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;
}
2 odpowiedzi
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.
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
Podobne pytania
Nowe pytania
c#
C # (wymawiane „patrz ostro”) jest językiem programowania wysokiego poziomu, statycznie typowanym, wieloparadygmatowym opracowanym przez firmę Microsoft. Kod C # zwykle jest przeznaczony dla rodziny narzędzi Microsoft .NET i czasów wykonywania, do których należą między innymi .NET Framework, .NET Core i Xamarin. Użyj tego tagu w przypadku pytań dotyczących kodu napisanego w C # lub C # formalnej specyfikacji.