Jak używać RestSharp z async / await

103

Usiłuję znaleźć nowoczesny przykład asynchronicznego kodu C #, który używa RestSharp z asynci await. Wiem, że niedawno wydano aktualizację autorstwa Haacka, ale nie wiem, jak korzystać z nowych metod.

Ponadto, w jaki sposób mogę podać token anulowania, aby operacja mogła zostać anulowana (powiedzmy, jeśli ktoś ma dość czekania i naciska przycisk Anuluj w interfejsie aplikacji).

Pure.Krome
źródło

Odpowiedzi:

202

Cóż, aktualizacja, do której odnosi się Haack, została wykonana przeze mnie :) Pozwólcie, że pokażę wam, jak z niej korzystać, ponieważ jest w rzeczywistości bardzo prosty. Wcześniej metody takie ExecuteAsyncGetzwracały niestandardowy typ RestSharp o nazwie RestRequestAsyncHandle. Nie można było oczekiwać tego typu, ponieważ async/awaitdziała on Taski Task<T>zwraca typy. Moje żądanie ściągnięcia dodało przeciążenia do istniejących metod asynchronicznych, które zwracają Task<T>wystąpienia. Te Task<T>przeciążenia mają dodany ciąg „Zadanie” dodany do ich nazw, na przykład Task<T>przeciążenie dla ExecuteAsyncGetjest wywoływane ExecuteGetTaskAsync<T>. Dla każdego z nowych Task<T>przeciążeń istnieje jedna metoda, która nie wymaga CancellationTokenokreślenia a, i jest taka, która to robi.

A teraz przejdźmy do faktycznego przykładu, jak go używać, który pokaże również, jak używać CancellationToken:

private static async void Main()
{
    var client = new RestClient();
    var request = new RestRequest("http://www.google.com");
    var cancellationTokenSource = new CancellationTokenSource();

    var restResponse = 
        await client.ExecuteTaskAsync(request, cancellationTokenSource.Token);

    // Will output the HTML contents of the requested page
    Console.WriteLine(restResponse.Content); 
}

Spowoduje to użycie ExecuteTaskAsyncprzeciążenia, które zwraca Task<IRestResponse>wystąpienie. Ponieważ zwraca a Task, możesz użyć awaitsłowa kluczowego w tej metodzie i otrzymać Task<T>zwrócony typ (w tym przypadku IRestResponse).

Możesz znaleźć kod tutaj: http://dotnetfiddle.net/tDtKbL

Erik Schierboom
źródło
AH! Myślę, że: serce: ty !! (I bardzo trafne, biorąc pod uwagę, że są Walentynki). Byłoby BARDZO fajnie dodać do wiki RestSharp. Ok, więc… jest jakaś szansa, że ​​jest to również PCL? A może spycham swoje szczęście?
Pure.Krome,
Nie jestem pewien, czy zadziałaby wersja PCL, ale przyjrzę się temu w przyszłości. I zgadzam się, że byłoby miło dodać do wiki, nie wiem, czy mogę to edytować (nie jestem regularnym opiekunem biblioteki).
Erik Schierboom,
Może uda nam się dostać @Haacked do konwoju, może na Twitterze?
Pure.Krome,
3
Jak mogę mapować na moją niestandardową implementację IRestResponse?
jpgrassi
2
Ponieważ ostatnio użyłem Restsharp mniej więcej w tym samym czasie, gdy modne były poduszki naramienne, telefony obrotowe były normą i wszyscy uwielbialiśmy uderzać w nasze ulubione BBS przez nasz modem Robotics 14.4k. Zielony haczyk potwierdzający odpowiedź, tak.
Pure.Krome
3

W moim przypadku musiałem wywołać Task.Wait (), aby działał poprawnie. Jednak użyłem wersji, która nie przyjmuje parametru CancellationTokenSource.

private static async void Main()
{
    var client = new RestClient();
    var request = new RestRequest("http://www.google.com");
    Task<IRestResponse> t = client.ExecuteTaskAsync(request);
    t.Wait();
    var restResponse = await t;
    Console.WriteLine(restResponse.Content); // Will output the HTML contents of the requested page
}
Ram Jayaraman
źródło
9
Używając Wait, nie wykorzystujesz kodu asynchronicznego, po prostu uruchamiasz go synchronicznie.
The Muffin Man
W moim przypadku wywołanie ExecuteTaskAsynk (z tokenem anulowania lub bez niego) nie zwraca i powoduje, że usługi IIS są nieodpowiednie. Musiałem użyć tego HACK-a, dopóki nie znalazłem przyczyny.
Alex 75
jeśli czekasz, dlaczego nie korzystasz po prostu z synchronizowanej wersji połączenia ... bezcelowe
Egli Becerra
1
Czy nie zwalniasz jednak wątku do wykorzystania w innym miejscu? W przypadku długotrwałej operacji po drugiej stronie, która jest korzystna, prawda?
benmccallum
tak, przyszedł wynik, czy odpowiedź jest prawidłowa, czy osiągam operację Async.
Prince Antony G