Restsharp сделать несколько асинхронный запрос - PullRequest
2 голосов
/ 25 марта 2019

Легко запросить API с restsharp.org, но когда мне нужно вызвать два разных API, первый запрос содержит код, а после ответа второй начинается, я думаю, что это не правильно, ниже мой код:

var client = new RestClient("http://xxx.yyy.com/");

var requestHotels = new RestRequest("api/hotelUi/home/hotelList", Method.POST);
requestHotels.AddParameter("take", "16");                                               
IRestResponse hotels = client.Execute(requestHotels); 
List<Hotel> topHotels = JsonConvert.DeserializeObject<List<Hotel>>(hotels.Content); 

var requestCities = new RestRequest("api/hotelUi/home/cityList", Method.POST);
requestCities.AddParameter("take", "16");                                                 
IRestResponse cities = client.Execute(requestCities);
List<City> topCities = JsonConvert.DeserializeObject<List<City>>(cities.Content);    

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

как мне это сделать?

1 Ответ

4 голосов
/ 25 марта 2019

Комментарии верны, используя ExecuteAsync (который также может десериализовать данные - см. http://restsharp.org/) с заданиями может выглядеть примерно так:

// Set up requests as before
var client = new RestClient("http://xxx.yyy.com/");

var requestHotels = new RestRequest("api/hotelUi/home/hotelList", Method.POST);
requestHotels.AddParameter("take", "16");  

var requestCities = new RestRequest("api/hotelUi/home/cityList", Method.POST);
requestCities.AddParameter("take", "16");     

var cancellationTokenSource = new CancellationTokenSource();

var hotelsTask = client.ExecuteTaskAsync<List<Hotel>>(requestHotels, cancellationTokenSource.Token);
var citiesTask = client.ExecuteTaskAsync<List<City>>(requestCities, cancellationTokenSource.Token);

var tasks = new List<Task> { hotelsTask, citiesTask };

// Pause execution here until both tasks are complete
await Task.WhenAll(tasks);

// Check status then use hotelsTask.Result and citiesTask.Result
...