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).
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:
privatestaticasyncvoidMain(){var client =newRestClient();var request =newRestRequest("http://www.google.com");var cancellationTokenSource =newCancellationTokenSource();var restResponse =await client.ExecuteTaskAsync(request, cancellationTokenSource.Token);// Will output the HTML contents of the requested pageConsole.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).
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.
privatestaticasyncvoidMain(){var client =newRestClient();var request =newRestRequest("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}
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.
W moim przypadku musiałem wywołać Task.Wait (), aby działał poprawnie. Jednak użyłem wersji, która nie przyjmuje parametru CancellationTokenSource.
źródło
Wait
, nie wykorzystujesz kodu asynchronicznego, po prostu uruchamiasz go synchronicznie.